2013-08-07 2 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 строк. Любая идея, почему это произойдет?

ответ

3

Вот ваша проблема:

fp.close 

Вы должны вызова метод close, а не просто ссылаться на него как метод. Итак:

fp.close() 

Однако, это сделает вашу жизнь проще, если вы используете with заявления вместо того, чтобы пытаться выяснить, где явно 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

Смежные вопросы