【问题标题】:Why is DictWriter not Writing all rows in my Dictreader instance?为什么 DictWriter 没有写入我的 Dictreader 实例中的所有行?
【发布时间】:2014-06-02 22:42:41
【问题描述】:

我是编码新手,默认情况下是 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 输出文件仅读取最后一个文件中的行。对我来说,如何打印 row 和 writerow 并获得不同的结果是没有意义的。显然我的 DictWriter 写错了,但我看不到在哪里。对大多数人来说可能很明显,但我很困惑。

【问题讨论】:

  • 您正在将文件打开到write(如果存在则覆盖它),而不是append(添加到它的末尾)。
  • 你写标题的方法过于冗长; writer.writeheaders() 会为你打个电话。

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


【解决方案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 将您的字段名作为初始标题写入输出文件。

【讨论】:

  • 绝对精彩!我对这个问题应用的任何逻辑都太线性了。先读然后写...首先(一次)打开写实例正是我想要的。关于 writeheader 的观点......网络上有很多误导性的“帮助”。
  • @dbell:Stack Overflow 正在帮助纠正误导性的“帮助”问题,一次一票! :-)
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 1970-01-01
  • 2013-08-10
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多