为什么DictWriter没有写入我DictReader实例中的所有行?
我刚开始学习编程,也刚接触Python,所以请多包涵…我正在努力学习。
我正在尝试写一些代码(Python 2.7),目的是从多个CSV文件中提取特定的表头,然后把它们导出到一个文件里。以下是我的代码:
import csv, os
path = 'C:/Test/'
for fn in os.listdir(path):
if ".csv" in fn:
with open(fn, 'rb') as f:
with open('C:/Test/fun/output.csv', 'wb') as fou:
reader = csv.DictReader(f, delimiter=",", quotechar="|")
writer = csv.DictWriter(fou, delimiter=",", quotechar="|", fieldnames= ['sku', 'stock.qty', 'stock.is_in_stock'], extrasaction='ignore')
headers = {}
for n in writer.fieldnames:
headers[n] = n
writer.writerow(headers)
for row in reader:
print row
writer.writerow(row)
elif ".csv" not in fn:
break
我用来读取文件的打印请求似乎会打印出多个文件中的所有行。我在测试3个已知行数的文件。然而,使用DictWriter生成的输出文件里只包含最后一个读取文件的行。这让我很困惑,为什么我可以打印行和写入行却得到不同的结果。显然我的DictWriter写得不对,但我不知道问题出在哪里。对大多数人来说可能很明显,但我还是搞不懂。
1 个回答
1
你每次读取一个匹配的CSV文件时,都在打开目标CSV文件并清空它。用'wb'
模式打开文件会让文件每次都被清空。
而且,一旦你发现某个文件名不是CSV文件,你就会跳出循环;这可能不是你想要的效果;可以把那里的else
部分去掉。
建议你只打开一次文件,然后在遍历目录时继续使用这个文件:
with open('C:/Test/fun/output.csv', 'wb') as fou:
writer = csv.DictWriter(fou, delimiter=",", quotechar="|", fieldnames= ['sku', 'stock.qty', 'stock.is_in_stock'], extrasaction='ignore')
writer.writeheader()
for fn in os.listdir(path):
if ".csv" in fn:
with open(fn, 'rb') as f:
reader = csv.DictReader(f, delimiter=",", quotechar="|")
for row in reader:
print row
writer.writerow(row)
我使用了DictWriter.writeheader()
方法,把你的字段名作为初始标题写入输出文件。