麻烦的Python操作/循环顺序

时间:2013-05-30 21:07:30

标签: 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']...)

现在,由于我的write语句都在for row in data循环中,因此我的标题被多次写入。

如果我发表第一个write声明,我会有明显的格式错误。
如果我将第二个write声明移到第一个然后突然出现之上,我的数据就会出现故障。

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

3 个答案:

答案 0 :(得分: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)

无需亲自完成所有操作。请注意我对the with statement的使用,在使用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"], ...])

正如kirelagin在表彰中指出的那样,csv.writerows()也可以使用generator expression

writer.writerows([row["name"], row["order_num"], ...] for row in reader)

答案 1 :(得分:5)

提取在主循环中将标题写在之外的代码,这样它只能在开头只写一次。

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

答案 2 :(得分:0)

好的,所以我想出来了,但这不是最优雅的解决方案。基本上,我只是运行第一个循环,写入文件,然后再次运行并附加结果。请参阅下面的代码。我希望能有更好的方式来完成我在这里所做的事情。谢谢!

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.close()

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('\n'+item['amt_due']+'\t'+item['due_date']...)
tab_file.close()