python客户端的PubSub publish()函数中的动态属性数

2024-10-06 12:32:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Python发布服务器客户端将消息发布到Pub/Sub service on the Google Cloud Platform

问题描述:

我有一个包含多张工作表的excel文件。每张图纸的列数不同。对于每个工作表,我需要将每一行作为单独的消息发布到云上的PubSub服务

对于具有4列的工作表,我使用以下步骤引用documentation中的示例代码:

  • 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文件中指定的工作表读取到数据框中。然后,我循环浏览每一行并按如下方式发布内容:

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条件就变得很乏味了

有没有更好的办法来解决这个问题


Tags: path方法消息datatopicargsfuturepublish
1条回答
网友
1楼 · 发布于 2024-10-06 12:32:56

有两件事:

  1. 您需要知道哪些图纸需要哪些属性。您可以用您想要的格式定义它,YAML或JSON非常适合这样做
{
 "sheet1": ["column1", "column2"],
 "sheet2": ["column1", "column2", "column3"],
 "sheet3": ["column1", "column2", "column3", "column4"],
}
  1. 然后,您需要动态构建属性列表以将它们与消息一起推送。您需要查看发布方法定义

def publish( self, topic, data, ordering_key="", retry=gapic_v1.method.DEFAULT, **attrs ):

还有文件串

attrs (Mapping[str, str]): A dictionary of attributes to be sent as metadata. (These may be text strings or byte strings.)

因此,现在,根据工作表,您需要构建一个字典并将其传递给publish方法

    dictionary={'column1':'columnvalue1','column2':'columnvalue2'}

    publisher.publish(topic_path, data,**dictionary)

你必须记住关键部分。现在使用一些算法浏览工作表,获取值,根据工作表编号和定义构建dict。就这些

相关问题 更多 >