基本问题,但让我很困惑。
我有一个大约有 4300 行的 csv 文件。
我需要将每一行发送到有大小限制的服务,因此我无法一次处理所有行。
所以我的想法是有一个函数,它在 csv 文件中的每一行的 for 循环中触发。
这就是我所做的。
with open('final_result.csv') as f:
reader = csv.reader(f)
for row in reader:
to_queue.append(row)
for msg in to_queue:
# print(msg)
def send_a_list_of_messages(sender):
# print(to_queue)
message = [ServiceBusMessage(str(msg))]
sender.send_messages(message)
print("msg sent: " + str(msg))
我对此的期望是,msg
应该以渐进方式从 csv 文件中获取每个值,将其传递给函数并发送。
在某种程度上,这就是发生的情况,但它只发送 csv 文件的 last
行。
我想知道我做错了什么?我怎样才能让这个 for 循环触发 csv 中每一行的内部函数?
编辑:
这是完整的代码:
def send_a_list_of_messages(sender):
# print(to_queue)
message = ServiceBusMessage(str(msg))
sender.send_messages(message)
print("msg sent: " + str(msg))
with open('final_result.csv') as f:
reader = csv.reader(f)
for row in reader:
to_queue.append(row)
for msg in to_queue:
send_a_list_of_messages(msg)
servicebus_client = ServiceBusClient.from_connection_string(conn_str=CONNECTION_STR, logging_enable=True)
#
with servicebus_client:
sender = servicebus_client.get_queue_sender(queue_name=QUEUE_NAME)
with sender:
send_a_list_of_messages(sender)
print("Done sending messages")
print("-----------------------")
with servicebus_client:
receiver = servicebus_client.get_queue_receiver(queue_name=QUEUE_NAME, max_wait_time=5)
with receiver:
for msg in receiver:
print("Received: " + str(msg))
receiver.complete_message(msg)
在service_client中调用该函数
答案 0 :(得分:1)
您需要在调用之前定义您的函数。在您发布的示例中,您重复定义了您的函数,但没有调用它。因此,您需要定义该函数,然后在循环中调用它。
编辑:我在编辑后调整了代码,您的问题似乎是在您尝试发送邮件之前没有为发件人分配值。
def send_a_list_of_messages(sender, msg):
# print(to_queue)
message = ServiceBusMessage(str(msg))
sender.send_messages(message)
print("msg sent: " + str(msg))
with open('final_result.csv') as f:
reader = csv.reader(f)
for row in reader:
to_queue.append(row)
servicebus_client = ServiceBusClient.from_connection_string(conn_str=CONNECTION_STR, logging_enable=True)
sender = servicebus_client.get_queue_sender(queue_name=QUEUE_NAME)
for msg in to_queue:
send_a_list_of_messages(sender, msg)
print("Done sending messages")
print("-----------------------")
receiver = servicebus_client.get_queue_receiver(queue_name=QUEUE_NAME, max_wait_time=5)
for msg in receiver:
print("Received: " + str(msg))
#I'm not certain what the receiver.complete_message does, but remember that you call this in a loop.
receiver.complete_message(msg)
答案 1 :(得分:0)
在目前的形式下,由于一些原因,它无法工作。
当您在 for
循环中重新定义一个函数时,它会遮蔽(覆盖)该函数的前一次迭代。所以只有最终的定义才能保留下来。
您可以采取一些措施来解决此问题。
list
传递给函数:def send_a_list_of_messages(sender, messages):
for msg in messages:
message = ServiceBusMessage(str(msg))
sender.send_messages(message)
print("msg sent: " + str(msg))
to_queue = []
with open('final_result.csv') as f:
reader = csv.reader(f)
for row in reader:
to_queue.append(row)
servicebus_client = ServiceBusClient.from_connection_string(
conn_str=CONNECTION_STR,
logging_enable=True
)
with servicebus_client:
sender = servicebus_client.get_queue_sender(queue_name=QUEUE_NAME)
with sender:
send_a_list_of_messages(sender, to_queue)
def send_a_single_message(sender, msg):
message = ServiceBusMessage(str(msg))
sender.send_messages(message)
print("msg sent: " + str(msg))
to_queue = []
with open('final_result.csv') as f:
reader = csv.reader(f)
for row in reader:
to_queue.append(row)
servicebus_client = ServiceBusClient.from_connection_string(
conn_str=CONNECTION_STR,
logging_enable=True
)
with servicebus_client:
sender = servicebus_client.get_queue_sender(queue_name=QUEUE_NAME)
with sender:
for msg in to_queue:
send_a_single_message(sender, msg)
最好以参数的形式包含函数所需的一切,而不是依赖外部变量。
例如,如果您不将 msg
作为参数传递,则它仅在 msg
在同一文件中外部定义的条件下有效。这不会促进可重用性。