почему я получаю сообщение «закрытый файл» при запуске скрипта на python? - PullRequest
2 голосов
/ 12 мая 2011

простой фрагмент кода, просто распечатывает список URL, которые я поместил в текстовый файл (хотя он печатал их с символом \ n в конце каждого из них - как мне избавиться от \ n?) :

import mechanize, fileinput

with open('F:\Python\url_list2.txt') as urls:
    content = urls.readlines()
print content

во всяком случае, распечатал список, отлично. Запустите его снова, и я получу это сообщение в оболочке python:

<closed file 'F:\Python\url_list2.txt', mode 'r' at 0x0000000002E4E390>

Что происходит? Использование Windows 7 x64, если это имеет значение?

Ответы [ 6 ]

3 голосов
/ 12 мая 2011

with только сохраняет файл открытым в пределах блока отступа. Попробуйте:

import mechanize, fileinput

with open('F:\Python\url_list2.txt') as urls:
    content = urls.readlines()
    print urls # file still open.
print content

В основном с является синтаксическим сахаром для общего try except finally шаблона:

try:
    urls = open('F:\Python\url_list2.txt')
    # rest of indented block
finally:
    urls.close()
# stuff outside of indented block

Итак, ваш код переводится в:

import mechanize, fileinput
try:
    urls = open('F:\Python\url_list2.txt')
    # rest of indented block
    content = urls.readlines()
finally:
    urls.close()
# stuff outside of indented block.
print urls

Итак, вы видите, почему ваш URL-адрес отображается как закрытый файл ... вы просто закрыли его, выйдя из блока отступа with. Возможно, вы захотите print content увидеть content, который вы загрузили в переменную из закрытого файла urls.

2 голосов
/ 12 мая 2011

Может быть, вы хотите печатать content вместо urls?

Чтобы удалить новые строки, используйте rstrip.

2 голосов
/ 12 мая 2011

Попробуйте распечатать содержимое (URL-адреса пропали с закрытием.)

1 голос
/ 12 мая 2011

Когда вы используете with, это то, что на самом деле происходит:

with open(filepath) as f:
    # do stuff
print "YAY"
# do more stuff

Вышесказанное эквивалентно высказыванию:

f = open(filepath)
try:
    # do stuff
except:
    f.close()
finally:
    f.close()
    print "YAY"
    # do more stuff

Это объясняет, почему вы получаете эту ошибку?

0 голосов
/ 12 мая 2011

Оператор with автоматически закрывает дескриптор после выполнения всех операторов внутри него. Если вам нужен доступ к ручке впоследствии:

import mechanize, fileinput

urls = open('F:\Python\url_list2.txt')
content = urls.readlines()
print content

Если вы хотите избавиться от \n в конце каждой строки, используйте .strip():

import mechanize, fileinput

urls = open('F:\Python\url_list2.txt')
content = [x.strip() for x in urls.readlines()]
print content
0 голосов
/ 12 мая 2011

Предположительно, файловый объект, для которого вы уже вызвали close ()?Можем ли мы увидеть ваш код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...