为什么DictWriter没有写入我DictReader实例中的所有行?

0 投票
1 回答
2174 浏览
提问于 2025-04-18 03:15

我刚开始学习编程,也刚接触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()方法,把你的字段名作为初始标题写入输出文件。

撰写回答