2013-05-15 69 views
0

我想使用Python CSV模塊打開CSV文件進行附加。然後,從CSV文件列表中,我想讀取每個csv文件並將其寫入附加的CSV文件。我的腳本工作得很好 - 除了我無法找到一種方法從除了正在讀取的第一個CSV文件之外的所有文件中刪除標題。我確信我的else代碼塊沒有正確執行。也許我的if else代碼的語法是問題?任何想法將不勝感激。使用CSV模塊附加多個文件,同時刪除附加標題

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

回答

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檢查。其結果是一個更好的代碼塊(希望)不會讓你跳過圈子來理解發生了什麼。

+0

謝謝亨利。我堅持使用CSV模塊,但這很好!你們真的很棒。 – user2386858

+1

@ user2386858很高興能幫到你。 'csv'模塊非常棒,但當你不需要看到數據時(例如連接一堆文件),沒有任何意義。 –

1

你有效地迭代lstFiles兩次。對於您的列表中的每個文件,你運行你內心的for循環了從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() 

你也可以使用enumerate在lstFiles遍歷包含迭代次數和文件名的元組,但我認爲布爾值更清楚地顯示了邏輯。

您可能不想混合遍歷csv閱讀器並直接調用底層文件的readline。

+0

謝謝彼得。我在分配'oldHeader'的行遇到問題。我認爲'oldHeader = readFile.readline()'可能會更好。我結合了你和亨利的答案。 - Britta – user2386858