Подтвердить что ты не робот

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"?

4b9b3361

Ответ 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().

В одной строке нет бонусных баллов за то, что может быть более читаемым и функциональным по два.