簡體   English   中英

使用CSV模塊附加多個文件,同時刪除附加的標題

[英]Using CSV module to append multiple files while removing appended headers

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

您實際上對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()

您還可以在lstFiles上使用enumerate來對包含迭代計數和文件名的元組進行迭代,但是我認為布爾值可以更清楚地顯示邏輯。

您可能不希望在csv閱讀器上混合迭代並直接在基礎文件上調用readline。

我認為您要迭代太多次(在各種事情上:文件列表和文件本身)。 您肯定有一些一致性問題; 由於我們看不到您的變量初始化,因此很難確定。 這就是我想要的:

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的“魔術”),對代碼進行了相當大的整理,以使其易於遵循。 結果是一個更好的代碼塊(希望)不會讓您無所不用其極地了解正在發生的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM