0

每次以下运行时,我都会尝试创建一个新文件。目前它创建 1 个文件并覆盖它。有没有让它不覆盖并为每个循环创建一个新文件?

import xml.etree.ElementTree as ET
import time
import csv

with open('OrderCSV.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        orders_data = ET.Element('orders_data')
        orders = ET.SubElement(orders_data, 'orders')

        ##Order Details
        order_reference = ET.SubElement(orders, 'order reference')
        order_reference.set('',"12345")
        order_date = ET.SubElement(order_reference, 'order_date')
        order_priority  = ET.SubElement(order_reference, 'order_priority')
        order_category = ET.SubElement(order_reference, 'order_category')
        delivery_service = ET.SubElement(order_reference, 'delivery_service')
        delivery_service.text = row['delivery_service']

        timestr = time.strftime("%Y%m%d%H%M%S")

        mydata = ET.tostring(orders_data)
        myfile = open(timestr, "wb")
        myfile.write(mydata)
4

2 回答 2

2

您可以查看文件是否已存在并稍等片刻

    while True:
        timestr = time.strftime("%Y%m%d%H%M%S")
        if not os.path.exists(timestr):
            break
        time.sleep(.1)
    with open(timestr, "wb") as myfile:
        mydata = ET.tostring(orders_data)
        myfile.write(mydata)

无需等待,您只需添加几秒钟即可。如果您每秒处理大量文件名,这将导致文件名及时向前漂移。

    mytime = time.time()
    while True:
        timestr = time.strftime("%Y%m%d%H%M%S", time.localtime(mytime))
        if not os.path.exists(timestr):
            break
        time.sleep(.1)
    with open(timestr, "wb") as myfile:
        mydata = ET.tostring(orders_data)
        myfile.write(mydata)

另一种选择是在循环之前获取单个时间戳并随时更新它。

mytime = time.strftime("%Y%m%d%H%M%S")
for index, row in enumerate(reader):
     ....
     mytime = f"mytime-{index}"
     ....
于 2020-10-27T23:05:49.677 回答
0

每次运行循环时更改变量名,我建议使用 with 语句打开文件,因为打开文件后还必须关闭它

with open(timestr, 'wb') as myfile:
    myfile.write(mydata)

编辑:我在您的代码中可以想象的唯一缺陷是打开文件后没有关闭文件

于 2020-10-27T22:40:35.193 回答