麻烦的Python操作/循环顺序

Dry*_*ong 0 python

我有一些代码用于将CSV文件转换为制表符分隔文件.我的问题是我无法弄清楚如何以正确的顺序写出正确的值.这是我的代码:

for file in import_dir:
    data = csv.reader(open(file))
    fields = data.next()
    new_file = export_dir+os.path.basename(file)
    tab_file = open(export_dir+os.path.basename(file), 'a+')
    for row in data:
        items = zip(fields, row)
        item = {}
        for (name, value) in items:
            item[name] = value.strip()
    tab_file.write(item['name']+'\t'+item['order_num']...)
    tab_file.write('\n'+item['amt_due']+'\t'+item['due_date']...)
Run Code Online (Sandbox Code Playgroud)

现在,因为我的两个write语句都在for row in data循环中,所以我的标题被多次写入.

如果我突然出现第一个write语句,我将会出现明显的格式错误.
如果我将第二个write语句移到第一个语句之上,然后是outdent语句,那么我的数据将会出现故障.

我该怎么做才能确保第一个write语句作为标题写入一次,第二个语句为CSV文件中的每一行写入?如何在不破坏字典的情况下在循环外提取第一个'write'语句?谢谢!

Gar*_*tty 7

csv模块包含写入和阅读的方法,使这非常简单:

import csv

with open("test.csv") as file, open("test_tab.csv", "w") as out:
    reader = csv.reader(file)
    writer = csv.writer(out, dialect=csv.excel_tab)
    for row in reader:
        writer.writerow(row)
Run Code Online (Sandbox Code Playgroud)

不需要自己动手.请注意我对该with语句的使用,使用Python中的文件时应始终使用语句.

编辑:当然,如果你想选择特定的值,你可以很容易地做到这一点.您似乎正在创建自己的字典来选择值 - 同样,csv模块提供DictReader了为您执行此操作:

import csv

with open("test.csv") as file, open("test_tab.csv", "w") as out:
    reader = csv.DictReader(file)
    writer = csv.writer(out, dialect=csv.excel_tab)
    for row in reader:
        writer.writerow([row["name"], row["order_num"], ...])
Run Code Online (Sandbox Code Playgroud)

正如kirelagin在赞誉中指出的那样,csv.writerows()也可以使用,这里有一个生成器表达式:

writer.writerows([row["name"], row["order_num"], ...] for row in reader)
Run Code Online (Sandbox Code Playgroud)


Ósc*_*pez 5

提取在主循环之外写入标题的代码,使其在开头只写入一次.

另外,考虑使用CSV模块写入CSV文件(不只是用于阅读),不要重新发明轮子!