2015-04-29 1 views
-1

При запуске этого простого скрипта «output_file.csv» остается открытым. Я не уверен, как закрыть файл в этом сценарии.Python Script Не удается найти файл-объект для закрытия

Я рассмотрел другие примеры, в которых функция open() назначается переменной, такой как 'f', и объект закрывается с помощью f.close(). Из-за with/как csv-file, я не понимаю, где находится файл. Кто-нибудь мог бы концептуально объяснить, где отключиться? В идеале, хотелось бы знать:

  1. как проверить пространство имен для всех открытых файлов объектов
  2. как определить правильный метод для закрытия этих объектов

простой скрипт для чтения столбцов данных, где отображение в колонке 1 заполняется, заполняется

import csv 

output_file = csv.writer(open('output_file.csv', 'w')) 
csv.register_dialect('mydialect', doublequote=False, quotechar="'") 

def csv_writer(data): 
    with open('output_file.csv',"ab") as csv_file: 
     writer = csv.writer(csv_file, delimiter=',', lineterminator='\r\n', dialect='mydialect') 
     writer.writerow(data) 

D = [[]] 
for line in open('inventory_skus.csv'): 
    clean_line = line.strip() 
    data_points = clean_line.split(',') 
    print data_points 
    D.append([line.strip().split(',')[0], line.strip().split(',')[1]]) 

D2 = D 
for i in range(1, len(D)): 
    nr = D[i] 
    if D[i][0] == '': 
     D2[i][0] = D[i-1][0] 
    else: 
     D2[i] = D[i] 

for line in range(1, len(D2)): 
    csv_writer(D2[line]) 
    print D2[line] 
+0

Вы делаете ненужный явный 'open' в верхней части скрипта, и вы его не закрываете. Итак, почему вы удивлены тем, что файл остается открытым? – BartoszKP

+0

Возможный дубликат [python csv - не закрывающий файл] (http://stackoverflow.com/questions/3347775/python-csv-not-closing-file) – BartoszKP

+0

Сначала я попытался помещать output_file.close() в конец, но am получение этой ошибки: output_file.close() Объект AttributeError: '_csv.writer' не имеет атрибута 'close' удаление исходного файла output_file = csv.writer (open ('output_file.csv', 'w')) все еще заставил файл оставаться открытым – Jonathan

ответ

0

Фактически вы создаете два файловых объекта (двумя разными способами). Первый из них:

output_file = csv.writer(open('output_file.csv', 'w')) 

Это скрыт в csv.writer и не подвергаются тем же самым, однако вы не используете, что выходной писатель вообще, в том числе, не закрывая его. Поэтому он остается открытым до сбора мусора.

В

with open('output_file.csv',"ab") as csv_file: 

вы получите объект файла в csv_file. Блок контекста заботится о закрытии объекта, поэтому его не нужно закрывать вручную (файловые объекты - это контекстные менеджеры).

Вручную индексировать по D2 не нужно. Кроме того, почему вы открываете файл CSV в двоичном режиме?

def write_data_row(csv_writer, data): 
    writer.writerow(data) 

with open('output_file.csv',"w") as csv_file: 
    writer = csv.writer(csv_file, delimiter=',', lineterminator='\r\n', dialect='mydialect') 

    for line in D2[1:]: 
     write_data_row(writer, line) 
     print line 
+0

А, спасибо. Я удаляю ненужный файл output_file в начале. Однако второй объект, по-видимому, не закрывается контекстным блоком. Когда я запускаю консоль, 'csv_file' не определяется за пределами этого блока, поэтому не знаю, как его закрыть. – Jonathan

+0

Как вы определяете, что он не закрыт? Если я попробую 'writer.writerow ('abc')' после с-блока, я получаю операцию ValueError: I/O в закрытом файле. – dhke

+0

при открытии output_file.csv я получаю сообщение об ошибке от excel, говорящего в использовании другим пользователем/программой – Jonathan

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