为什么DictWriter不在我的Dictreader实例中写入所有行?

时间:2014-04-18 12:10:03

标签: python python-2.7 export-to-csv

我是编码的新手,默认情况下是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 个答案:

答案 0 :(得分: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() method将您的字段名称作为初始标题写入输出文件。