我正在尝试使用Python发布者客户端向Google云平台上的Pub/Sub服务发布消息。
问题描述:
我有一个excel文件与多个工作表。每张表格都有不同数量的列。对于每个工作表,我需要将每一行作为单独的消息发布到云上的PubSub服务。
对于有4列的表,我参考文档中的示例代码使用了以下步骤:
- 从
google.cloud.pubsub_v1.PublisherClient()
类创建一个名为publisher
的对象 - 使用
publisher.publish()
方法将数据发送到云上的我的主题 - 在
publish()
方法的参数中,我将每列视为消息中的一个属性,如下面的代码行所示(这一行将用于从一行发布):future = publisher.publish(topic_path, data, column1 = columnvalue1 , column2 = columnvalue2)
问题:
在我正在编写的程序中,我希望从用户指定的工作表发布消息。由于不同的工作表有不同的列数,我想知道是否有任何方法可以根据特定工作表中的列数动态改变publish()
函数中的参数数?
我的尝试;我尝试使用if-else语句的蛮力方法。例如,有三张分别有2列、3列和4列的表格;我将指定的工作表从Excel文件读取到pandas数据框架中。然后循环遍历每一行并发布内容,如下所示:
for i,row in df.iterrows():
# <All other relevant code and operations>
if (args.sheet == 'Sheet1'):
future = publisher.publish(topic_path, data, column1 = columnvalue1 , column2 = columnvalue2)
elif (args.sheet == 'Sheet2'):
future = publisher.publish(topic_path, data, column1 = columnvalue1 , column2 = columnvalue2, column3 = columnvalue3)
elif (args.sheet == 'Sheet3'):
future = publisher.publish(topic_path, data, column1 = columnvalue1 , column2 = columnvalue2, column3 = columnvalue3, column4 = columnvalue4)
# <rest of the code>
这个方法有效;但随着页数的增加,不断添加更多的elif
条件成为一项繁琐的任务。
有没有更好的方法来解决这个问题?
有两件事:
- 您需要知道哪个表需要哪些属性。你可以用你想要的格式定义它,YAML或JSON都很适合
{
"sheet1": ["column1", "column2"],
"sheet2": ["column1", "column2", "column3"],
"sheet3": ["column1", "column2", "column3", "column4"],
}
- 然后您需要动态构建属性列表以将它们与消息一起推送。您需要查看一下发布方法定义
def发布(Self, topic, data, ordering_key=", retry=gapic_v1.method。默认情况下,* * attrs):
和文档字符串
因此,现在,根据表单,您需要构建一个字典并将其传递给publish方法attrs (Mapping[str, str]):作为元数据发送的属性字典。(可以是文本字符串或字节字符串)
dictionary={'column1':'columnvalue1','column2':'columnvalue2'}
publisher.publish(topic_path, data,**dictionary)
你必须把关键部分。现在一些算法来浏览你的表,获取值,根据表号和定义建立字典。就这些