Я использую модуль CSV для чтения файла с разделением табуляцией. Код ниже:
z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t')
Но когда я добавляю Z.close () к концу моего сценария, я добираюсь, и ошибка, указывая "csv.reader' объект не имеет никакого атрибута 'близко'"
z.close()
Таким образом, как я закрываю "Z"?
Читатель на самом деле просто парсер. Когда вы запрашиваете у него строку данных, он делегирует действие чтения базовому объекту 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
.
Благодарю Джареда за указание на проблемы совместимости с оператором с
.
Вы не закрываете программы чтения 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()
Вы не закрываете результат метода reader ()
, вы закрываете результат метода open ()
. Итак, используйте два оператора: foo = open (...); bar = csv.reader (foo)
. Затем вы можете вызвать foo.close ()
.
Не начисляются бонусные баллы за выполнение в одной строке того, что может быть более читаемым и функциональным в две строки.