0

我想使用 Python CSV 模块打开一个 CSV 文件进行附加。然后,从 CSV 文件列表中,我想读取每个 csv 文件并将其写入附加的 CSV 文件。我的脚本运行良好 - 除了我找不到从所有正在读取的第一个 CSV 文件中删除标题的方法。我确信我else的代码块没有正确执行。也许我的if else代码语法是问题所在?任何想法将不胜感激。

writeFile = open(append_file,'a+b')
writer = csv.writer(writeFile,dialect='excel')
    for files in lstFiles:
        readFile = open(input_file,'rU')
        reader = csv.reader(readFile,dialect='excel')
        for i in range(0,len(lstFiles)):
            if i == 0:
                oldHeader = readFile.readline() 
                newHeader = writeFile.write(oldHeader) 
                for row in reader: 
                    writer.writerow(row)
            else:
                reader.next()
                for row in reader:
                    row = readFile.readlines()
                    writer.writerow(row)
        readFile.close()
writeFile.close() 
4

2 回答 2

1

您有效地迭代了 lstFiles 两次。对于列表中的每个文件,您都在从 0 开始运行内部 for 循环。您需要以下内容:

writeFile = open(append_file,'a+b')
writer = csv.writer(writeFile,dialect='excel')
headers_needed = True
for input_file in lstFiles:
    readFile = open(input_file,'rU')
    reader = csv.reader(readFile,dialect='excel')
    oldHeader = reader.next()
    if headers_needed:
        newHeader = writer.writerow(oldHeader)
        headers_needed = False 
    for row in reader:
        writer.writerow(row)
    readFile.close()
writeFile.close()

您也可以使用enumeratelstFiles 来迭代包含迭代计数和文件名的元组,但我认为布尔值更清楚地显示了逻辑。

您可能不想混合迭代 csv 阅读器并直接在基础文件上调用 readline。

于 2013-05-15T17:38:24.843 回答
0

我认为您迭代了太多次(在各种事情上:您的文件列表和文件本身)。你肯定有一些一致性问题;有点难以确定,因为我们看不到您的变量初始化。这就是我认为你想要的:

with open(append_file,'a+b') as writeFile:
    need_headers = True
    for input_file in lstFiles:
        with open(input_file,'rU') as readFile:
            headers = readFile.readline()
            if need_headers:
                # Write the headers only if we need them
                writeFile.write(headers)
                need_headers = False
            # Now write the rest of the input file.
            for line in readFile:
                writeFile.write(line)

我取出了所有 csv 特定的东西,因为没有理由将它用于此操作。我还对代码进行了相当大的清理以使其更易于理解,使用文件作为上下文管理器和一个命名良好的布尔值而不是“魔术”i == 0检查。结果是一个更好的代码块(希望)不会让您跳过箍来了解正在发生的事情。

于 2013-05-15T17:43:23.850 回答