2013-08-07 5 views
1

코드는 디렉토리에서 xls 파일을 읽고 csv 파일로 변환 한 후 다른 디렉토리로 복사하는 것입니다.python shutil : 파일의 일부만 복사하십시오.

filePath = os.path.join('.', 'attachments') 
filePaths = [f for f in os.listdir(filePath) if os.path.isfile(os.path.join(filePath, f)) and f.endswith('.xls')] 

for f in filePaths: 
    wb = xlrd.open_workbook(os.path.join(filePath, f)) 
    sheet = wb.sheet_by_index(0) 
    filename = f + '.csv' 
    fp = open(os.path.join(filePath, filename), 'wb') 
    wr = csv.writer(fp, quoting=csv.QUOTE_ALL) 
    for rownum in xrange(sheet.nrows): 
     wr.writerow(sheet.row_values(rownum)) 
    fp.close 

    shutil.copy(os.path.join('.', 'attachments', filename), new_directory) 

결과는 다음과 같습니다 XLS 파일이 성공적으로 csv 파일로 변환하지만, new_directory에 복사 된 파일은 CSV 파일의 일부를 포함합니다.

예를 들어 원본 csv 파일의 행은 30 개이지만 복사 된 파일의 행은 17 개뿐입니다. 왜 이런 일이 일어날까요? 당신은 단지 방법으로 그것을 참조하지, 전화close 방법이 필요

fp.close 

:

답변

3

는 여기에 귀하의 문제입니다. 그래서 : 당신이 알아 내려고 대신 with 문을 사용하는 경우

fp.close() 

그러나, 그것은 여러분의 인생을 더 쉽게 만드는 곳 명시 적으로 close 모든 : 내가 만든 것을 바보 같은 실수

with open(os.path.join(filePath, filename), 'wb') as fp: 
    wr = csv.writer(fp, quoting=csv.QUOTE_ALL) 
    for rownum in xrange(sheet.nrows): 
     wr.writerow(sheet.row_values(rownum)) 
+0

음, 어디. 빠른 답변 주셔서 대단히 감사합니다! – Cacheing

+0

하지만 여전히'fp.close'를 사용하여 오류를 얻지 못했습니다. 'fp.close'와'fp.close()'의 차이점은 무엇입니까? – Cacheing

+2

'fp.close'는 함수에 대한 참조를 얻습니다. 오류가 아닙니다.이 참조를 변수에 저장하여 나중에 호출하고, 다른 함수에 전달하여 결국 호출 할 수 있습니다.'()'는 함수를 호출 *하는 작업입니다 (즉, 실행합니다). 그것. 따라서 일반적인 함수 호출은 실제로 두 부분으로 구성됩니다. 1) 함수에 대한 참조를 가져옵니다 (이름을 지정하고 다른 객체에 대한 참조를 얻는 것과 같습니다). 2) 호출합니다. – kindall