Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么DictWriter没有写入Dictreader实例中的所有行?_Python_Python 2.7_Export To Csv - Fatal编程技术网

Python 为什么DictWriter没有写入Dictreader实例中的所有行?

Python 为什么DictWriter没有写入Dictreader实例中的所有行?,python,python-2.7,export-to-csv,Python,Python 2.7,Export To Csv,我不熟悉编码,默认情况下也不熟悉Python,所以请原谅我的无知……我正在研究它 我试图编写一些代码(Python2.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/f

我不熟悉编码,默认情况下也不熟悉Python,所以请原谅我的无知……我正在研究它

我试图编写一些代码(Python2.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输出文件仅包含最后读取的文件中的行。对于我来说,如何打印行和writerow并获得不同的结果是毫无意义的。很明显,我的听写器写错了,但我不知道在哪里。对大多数人来说可能是显而易见的,但我感到困惑。

您正在打开您的目标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)

我使用将您的字段名作为初始标题写入输出文件。

您将文件打开到
w
rite(如果它存在,将覆盖它),而不是
a
ppend(添加到它的末尾)。您写入标题的方法过于冗长
writer.writeheaders()
只需一个电话就可以帮你解决这个问题。太棒了!我在这个问题上运用的任何逻辑都过于线性。先读后写…首先(一次)打开写实例正是我想要的。关于writeheader的观点……网络上有很多误导性的“帮助”。@dbell:Stack Overflow有助于纠正误导性的“帮助”问题,一次一票!:-)