0

我有一些代码旨在将 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语句被写入一次作为标题,第二个语句被写入 CSV 文件中的每一行?如何在不破坏字典的情况下提取循环外的第一个“写”语句?谢谢!

4

3 回答 3

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)

没有必要自己做这一切。请注意我对语句的使用,在 Python 中处理文件时应始终使用该语句。with

编辑:当然,如果你想选择特定的值,你可以很容易地做到这一点。您似乎正在制作自己的字典来选择值 - 同样,该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()也可以使用,这里带有生成器表达式

writer.writerows([row["name"], row["order_num"], ...] for row in reader)
于 2013-05-30T21:12:55.867 回答
5

提取在主循环之外写入标头的代码,这样它在开始时只被写入一次。

另外,考虑使用CSV 模块来编写 CSV 文件(不仅仅是读取),不要重新发明轮子!

于 2013-05-30T21:09:37.193 回答
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()
于 2013-05-30T23:10:56.553 回答