2011-10-10 5 views
2

내 파이썬 프로그램은 여러 csv 파일을 반복하고 읽어 들여 파일의 특정 열을 다른 CSV 파일에 작성합니다. 프로그램이 실행되는 동안 올바른 방식으로 작성된 파일을 볼 수 있지만 일단 프로그램이 완료되면 방금 작성한 모든 파일이 비게됩니다.파이썬, 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

Im using 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

파이썬 문서에서 인용 :

csvfile, 그것은 그 차이를 만드는 플랫폼에서 'B'플래그를 열어야합니다 파일 객체 인 경우.

'w'및 'r'플래그를 'wb'및 'rb'로 변경하십시오.

+0

귀하의 충고는 좋지만 빈 파일은 발생하지 않습니다. –

+0

고마워, 해봤지만 작동하지 않는 것 같아. – Drublic

0

(1) 외부 루프 개선하고 내부 루프 두 루프 변수로 i를 사용할 수 있습니다. 이것은 (a) 인간에 의해 이해되고 (b) 제대로 작동 할 것이라는 희망이 없습니다.

(2) except: print(i) ... 무엇이 ??? 나는 try/except를 제거하고 당신이 만난 버그를 고칠 것을 제안한다.