Python: нет csv.close()?
Я использую модуль CSV для чтения файла с разделителями табуляции. Код ниже:
z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t')
Но когда я добавляю Z.close() в конец моего script, я получаю и сообщает об ошибке, что объект "csv.reader" не имеет атрибута "закрыть" "
z.close()
Итак, как мне закрыть "Z"?
Ответы
Ответ 1
Читатель - это просто парсер. Когда вы запрашиваете строку данных, она делегирует действие чтения базовому объекту file
и просто преобразует результат в набор полей. Поэтому нет необходимости закрывать читателя; это будет бессмысленная операция.
Однако вы должны закрыть основной объект file
. В Python 2.5+, вот способ сделать это:
with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f:
z = csv.reader(f, delimiter='\t')
Если вы не знакомы с оператором with
, он в основном заключает его содержимое в блок try...finally
, который закрывает файл в части finally
. Для Python 2.5 вам понадобится импорт __future__
, чтобы включить оператор with
. Если вам нужно сохранить совместимость с более ранними версиями Python, например, 2.4, вы должны сделать закрытие самостоятельно, используя try...finally
.
Благодаря Jared для указания проблем совместимости с оператором with
.
Ответ 2
Вы не закрываете читатели CSV напрямую; вместо этого вы должны закрыть любой файл-подобный объект. Например, в вашем случае вы бы сказали:
f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast')
z = csv.reader(f, delimiter='\t')
...
f.close()
Если вы используете последнюю версию Python, вы можете использовать оператор with, например.
with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f:
z = csv.reader(f, delimiter='\t')
...
Это имеет то преимущество, что f
будет закрыто, даже если вы выбросите исключение или иначе вернетесь внутри с-блоком, тогда как такой случай приведет к тому, что файл останется открытым в предыдущем примере. Другими словами, он в основном эквивалентен блоку try/finally, например
f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast')
try:
z = csv.reader(f, delimiter='\t')
...
finally:
f.close()
Ответ 3
Вы не закрываете результат метода reader()
, вы закрываете результат метода open()
. Итак, используйте два оператора: foo=open(...); bar=csv.reader(foo)
. Затем вы можете вызвать foo.close()
.
В одной строке нет бонусных баллов за то, что может быть более читаемым и функциональным по два.