Python for 循环只迭代一次

时间:2021-07-30 10:47:38

标签: python-3.x for-loop

基本问题,但让我很困惑。

我有一个大约有 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中调用该函数

2 个答案:

答案 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 循环中重新定义一个函数时,它会遮蔽(覆盖)该函数的前一次迭代。所以只有最终的定义才能保留下来。

您可以采取一些措施来解决此问题。

  1. 直接将消息的 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)
  1. 循环调用该函数。
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 在同一文件中外部定义的条件下有效。这不会促进可重用性。