2011-10-10 44 views
2

我的python程序循環了一堆csv文件,讀取它們,並將文件中的特定列寫入另一個csv文件。程序運行時,我可以看到正確寫入的文件,但是一旦程序完成,我剛寫入的所有文件都變空了。Python,csv編寫器之後的空文件..再次

解決所有其他類似的線程似乎是關閉你寫的文件正確,但我似乎無法弄清楚我做錯了什麼。任何人?

import os 
import csv 

def ensure_dir(f): 
    d = os.path.dirname(f) 
    if not os.path.exists(d): 
     os.makedirs(d) 

readpath = os.path.join("d:\\", "project") 
savepath=os.path.join("d:\\", "save") 
ensure_dir(savepath) 
contents_1=os.listdir(readpath) 
for i in contents_1[1:len(contents_1)]: 
    readpath_2=os.path.join(readpath, i) 
    if os.path.isdir(readpath_2)== True : 
     contents_2=os.listdir(readpath_2) 
     for i in contents_2: 
      readpath_3=os.path.join(readpath_2, i) 
      if os.path.isfile(readpath_3)== True : 
       savefile=savepath + "\\" + i 
       savefile = open(savefile, 'wb') 
       writer = csv.writer(savefile, delimiter=';') 
       readfile=open(readpath_3, 'rb') 
       reader = csv.reader(readfile, delimiter=';') 
       try: 
        for row in reader: 
         writer.writerow([row[0], row[3]]) 
       except: 
        print(i) 
       finally: 
        savefile.close() 
        readfile.close() 
+0

你應該使用'try..finally'或者'with'-Statement來獲得乾淨的文件訪問,而不會出現這些問題。 – schlamar

+0

你正在使用哪種操作系統? – Martey

+0

即時通訊使用Windows 7 – Drublic

回答

1

savefile=savepath + "\\" + i是錯誤。如果"d:\\project\a\x.csv""d:\\project\b\x.csv"都存在,則您將多次寫入savepath + "\\" + i。如果第二個路徑爲空"x.csv",那麼它將用空文件覆蓋結果。

試試這個:

import os 
import csv 

def ensure_dir(f): 
    d = os.path.dirname(f) 
    if not os.path.exists(d): 
     os.makedirs(d) 

readpath = os.path.join("d:\\", "project") 
savepath = os.path.join("d:\\", "save") 

ensure_dir(savepath) 

for dname in os.listdir(readpath)[1:]: 
    readpath_2 = os.path.join(dname, fname) 
    if not os.path.isdir(readpath_2): 
     continue 
    for fname in os.listdir(readpath_2) 
     fullfname = os.path.join(readpath_2, fname) 
     if not os.path.isfile(fullfname): 
      continue 
     savefile = open(savepath + "\\" + dname + "_" + fname, wb) 
     writer = csv.writer(savefile, delimiter=';') 
     readfile=open(fullfname, 'rb') 
     reader = csv.reader(readfile, delimiter=';') 
     try: 
      for row in reader: 
       writer.writerow([row[0], row[3]]) 
     except: 
      print(i) 
     finally: 
      savefile.close() 
      readfile.close() 

這個代碼可以大大有os.walk

+0

謝謝,像魅力一樣工作。並感謝os.walk上的提示。 – Drublic

0

從Python文檔引用:

如果csvfile是,它必須與平臺上的「B」標誌,在有差別打開的文件對象。

將'w'和'r'標誌更改爲'wb'和'rb'。

+0

你的建議很好,但不會造成空文件。 –

+0

謝謝,我試過了,但它似乎沒有工作。 – Drublic

0

(1)你的外循環和改善你的內循環都使用i作爲循環變量。 (a)不被人理解(b)正確工作。

(2)except: print(i) ...什麼?我建議你刪除try/except並修復你遇到的任何錯誤。