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