использование ввода файла с openbook = hook_compressed - PullRequest
1 голос
/ 10 декабря 2011

Я пытаюсь fileinput для чтения некоторых сжатых файлов, и я попробовал следующие три метода, однако, ни один из них действительно не работает.

file=os.join.path(path+filename)

for i,line in enumerate(fileinput([file], openhook=gzip.open)):
for i,line in enumerate(fileinput.input(openhook=fileinput.hook_compressed(file1,'r'))):
for i,line in enumerate(fileinput.FileInput(openhook=fileinput.hook_compressed(file1,'r'))):

Для первой команды ошибки выглядят так:

'module' object is not callable

Для третьей команды ошибки вроде:

Traceback (most recent call last):
  File "read_file.py", line 15, in <module>
    for i,line in enumerate(fileinput.input(openhook=fileinput.hook_compressed(file1,'r'))):
  File "/share/lib/python2.6/fileinput.py", line 103, in input
    _state = FileInput(files, inplace, backup, bufsize, mode, openhook)
  File "/share/lib/python2.6/fileinput.py", line 230, in __init__
    raise ValueError("FileInput openhook must be callable")
ValueError: FileInput openhook must be callable

Я не понимаю, почему openhook здесь не может быть вызван?

Может кто-нибудь помочь мне с этим? ТНХ

1 Ответ

3 голосов
/ 21 августа 2012

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

for i, line in enumerate(fileinput.input(openhook=fileinput.hook_compressed)):
    sys.stdout.write("%-6i %s" % (i, line))

Более подробно, если function является объектом функции (что-то, что кто-то объявил с помощью def илиlambda), затем

variable = function()

вызывает функцию и сохраняет результат в variable.Когда вместо этого вы говорите

variable = function

, вы назначаете (ссылку на) функциональный объект на variable, так что теперь вы можете использовать

 variable()

как эффективный синоним для

function()

Это использование является относительно редким в противном случае, но определенно является нормой для переменных-ловушек (и, в действительности, весь смысл переменных-ловушек - они предлагают «ловушку», где вы можете поместить свою собственную функцию в поток другойкласс или функция. Они также известны как обратные вызовы, , если этот термин должен быть более знакомым).

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