Python异步生成VIN写入CSV时拆分存储问题求助
问题解决:VIN写入CSV被拆分的问题
问题根源
你代码里的核心问题是:asyncio.gather()返回的是包含各协程结果的列表,而你用for VIN in VIN:循环把列表里的每个元素单独写入了一行CSV,导致完整VIN被拆成多段存储。
另外还有两个次要问题:
if __name__ == "__main__":放在循环内部会重复创建事件循环,不符合规范- 末尾的VIN校验逻辑用的是循环最后一次的单个片段,不是完整VIN,校验结果无意义
修正后的代码
import random import string import asyncio import csv async def get_random_string(length): letters = string.ascii_uppercase result_str = ''.join(random.choice(letters) for i in range(length)) return result_str async def my_function1(): return str(random.randint(0, 9)) async def my_function2(): return str(random.randint(100, 999)) async def my_function3(): return str(random.randint(100000, 999999)) if __name__ == "__main__": loop = asyncio.get_event_loop() with open('VIN.csv', 'w', newline='') as csvfile: # 添加newline=''避免CSV出现空行 fieldnames = ['VIN'] thewriter = csv.DictWriter(csvfile, fieldnames=fieldnames) thewriter.writeheader() for _ in range(100): # 收集所有协程结果,得到片段列表 vin_parts = loop.run_until_complete(asyncio.gather( my_function1(), get_random_string(3), my_function2(), get_random_string(4), my_function3() )) # 拼接成完整VIN字符串 full_vin = "".join(vin_parts) print(full_vin) # 写入完整VIN到一行 thewriter.writerow({"VIN": full_vin}) # 对当前完整VIN做校验 has_uppercase = any(ele.isupper() for ele in full_vin) print(f"Does String contain uppercase character : {has_uppercase}") is_correct_length = len(full_vin) == 17 print(f"VIN length = 17 : {is_correct_length}")
关键修改点
- 把
if __name__ == "__main__":移到最外层,只创建一次事件循环 - 将原
VIN变量改名为vin_parts,明确是VIN的片段列表,避免变量名混淆 - 用
"".join(vin_parts)生成完整VIN字符串,再写入CSV一行,而非循环写入每个片段 - 添加
newline=''到open()中,避免Windows系统下CSV出现多余空行 - 把校验逻辑移到循环内部,针对每次生成的完整VIN进行校验,确保结果有效
内容的提问来源于stack exchange,提问作者kaycia_g
相关产品推荐
相关产品推荐

