我有一些代码用于将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'语句?谢谢!
答案 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()