Python: Никакой csv.close ()?

Я использую модуль CSV для чтения файла с разделением табуляцией. Код ниже:

z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t')

Но когда я добавляю Z.close () к концу моего сценария, я добираюсь, и ошибка, указывая "csv.reader' объект не имеет никакого атрибута 'близко'"

z.close()

Таким образом, как я закрываю "Z"?

48
задан Harpal 9 July 2010 в 22:31
поделиться

3 ответа

Читатель на самом деле просто парсер. Когда вы запрашиваете у него строку данных, он делегирует действие чтения базовому объекту 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 . Для Python 2.5 вам понадобится импорт __ future __ , чтобы включить оператор with . Если вам нужно сохранить совместимость с более ранними версиями Python, такими как 2.4, вы должны закрыть себя, используя try ... finally .


Благодарю Джареда за указание на проблемы совместимости с оператором с .

51
ответ дан 26 November 2019 в 18:50
поделиться

Вы не закрываете программы чтения 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 будет закрыто, даже если вы создадите исключение или иным образом вернетесь внутри блока with, тогда как в таком случае файл останется открытым в предыдущем примере. Другими словами, это в основном эквивалент блока try / finally, например.

f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast')
try:
    z = csv.reader(f, delimiter='\t')
    ...
finally:
    f.close()
30
ответ дан 26 November 2019 в 18:50
поделиться

Вы не закрываете результат метода reader () , вы закрываете результат метода open () . Итак, используйте два оператора: foo = open (...); bar = csv.reader (foo) . Затем вы можете вызвать foo.close () .

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

3
ответ дан 26 November 2019 в 18:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: