使用CSV模块附加多个文件,同时删除附加的标题

时间:2013-05-15 17:34:00

标签: python csv

我想使用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() 

2 个答案:

答案 0 :(得分:1)

您有效地迭代lstFiles两次。对于列表中的每个文件,您将从0开始运行内部循环。您需要类似的内容:

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()

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

您可能不希望在csv阅读器上混合迭代并直接在底层文件上调用readline。

答案 1 :(得分: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特定的东西,因为没有理由将它用于此操作。我还大大清理了代码,使其更容易理解,使用文件作为上下文管理器和一个名为boolean而不是“magic”i == 0检查。结果是一个更好的代码块(希望)不会让你跳过箍来理解发生了什么。