2015-08-23 63 views
-1

我想通過文件列表循環,並在每列中添加一些額外的信息。以下代碼片段適用於一個文件,但如果我有許多文件無法使用。IndexError:列表索引超出範圍while循環通過整個目錄

代碼:

def list_csv_files(csv_folder): 
    input_file_list = []  
    for root, dirs, files in os.walk(cwd): 
     for name in files: 
      if name.endswith(".csv"): 
       input_file_list.append(os.path.relpath(os.path.join(root, name))) 
       print input_file_list 
       with open(input_file, 'rb') as f, open(temp_file, 'w') as fo: #PROBLEM HERE 
        reader = csv.reader(f, delimiter=',') 
        for row in reader: 
         one = '"'+ row[0] + '"' 
         two = row[1] 
         three = '"'+ row[2] +'"' 
         print >> fo, one,two,three 
        os.rename(temp_file, input_file) 
list_csv_files(csv_folder) 

輸入文件1:foo.csv

ProjectB - TIM - 2619,2,4/11/07 
ProjectB - TIM - 2504,2,9/19/06 
ProjectB - TIM - 2374,2,4/7/06 
ProjectB - TIM - 2373,2,4/7/06 
ProjectB - TIM - 2284,2,2/21/06 

輸入文件2:bar.csv

ProjectC - TIM - 2619,2,4/11/07 
ProjectC - TIM - 2504,2,9/19/06 

期望輸出File1中:FOO。 csv

"ProjectB - TIM - 2619" 2 "4/11/07" 
"ProjectB - TIM - 2504" 2 "9/19/06" 
"ProjectB - TIM - 2374" 2 "4/7/06" 
"ProjectB - TIM - 2373" 2 "4/7/06" 
"ProjectB - TIM - 2284" 2 "2/21/06" 

預期輸出文件2:bar.csv

"ProjectC - TIM - 2619" 2 "4/11/07" 
"ProjectC - TIM - 2504" 2 "9/19/06" 

錯誤 - 我得到錯誤索引超時錯誤的,因爲不能環路直通的所有文件。

File "read_csv.py", line 143, in <module> 
    two = row[1] 
IndexError: list index out of range 
+2

有一些線,沒有任何','所有,也許一個空行,你有沒有檢查? –

+0

是你輸入輸出的確切輸入輸出你?? –

+1

請顯示一個不起作用的文件! – Ymartin

回答

1

在遍歷所有文件時,您遇到了問題,因爲某些文件的行數不包含預期的列數。

您正在執行的過程也意味着在運行一次腳本後,如果您第二次運行腳本,則所有文件都會失敗。

我建議修改腳本如下。它測試每一行都有正確的列數。如果號碼不正確,它會中止寫入temp_file,並讓您知道哪些行號碼失敗並繼續處理剩餘的文件。

另外,您需要在with之外執行重命名操作,否則該文件仍會打開。

運行腳本的最終結果是,您將離開轉換被中止的臨時文件。然後可以手動修復這些腳本並重新啓動腳本。之後,您可以刪除所有_temp_文件。

因此,基於你原來的問題代碼:

import os, csv 

def csv_all_files(): 
    folder = "mystartfolder" 

    for item in os.listdir(folder): 
     endaddress = item 
     if endaddress.endswith(".csv"): 
      print endaddress 
      input_file = os.path.join(folder,item) 
      temp_file = os.path.join(folder, item + "_temp_") 
      ok = True 

      with open(input_file, 'r') as f_input, open(temp_file, 'w') as f_output: 
       reader = csv.reader(f_input, delimiter=',') 
       for line_number, row in enumerate(reader): 
        if len(row) == 3: 
         f_output.write('"{}" {} "{}"\n'.format(row[0], row[1], row[2])) 
        else: 
         print "{} line {} is badly formatted".format(input_file, line_number+1) 
         ok = False 
         break 

      if ok: 
       os.rename(temp_file, input_file) 

csv_all_files() 

通過做這種方式,輸出會告訴你在哪裏任何有問題的CSV文件。

0

通過將修改後的文件重命名爲原始文件來開始創作,並且您從不寫入輸出,您正在爲自己的作品製作棒。
試試這個:

#def list_csv_files(csv_folder): 
import os, csv 
input_file_list = [] 
cwd = os.getcwd() 
input_file_list = [] 

for root, dirs, files in os.walk(cwd): 
    for name in files: 
     if name.endswith(".csv"): 
      print name 
      input_file_list.append(os.path.relpath(os.path.join(root, name))) 
      print input_file_list 
for input_file in input_file_list: 
    temp_file = "./temp.out" 
    f = open(input_file, 'rb') 
    fo = open(temp_file, 'w') 
    reader = csv.reader(f, delimiter=',') 
    for row in reader: 
     one = '"'+ row[0] + '"' 
     two = row[1] 
     three = '"'+ row[2] +'"' 
     fo.write(one+" "+two+" "+three+"\n") 
    f.close() 
    fo.close() 
    os.rename(temp_file, input_file) 
相關問題