Вопрос по python – Попытка прочитать открытый файл во второй раз не дает никаких данных

3
fin = open('/abc/xyz/test.txt', 'a+')

def lst():
  return fin.read().splitlines()

print lst()

def foo(in):
  print lst()
  fin.write(str(len(lst()) + in)
  fin.flush()

В приведенном выше коде, когдаprint lst() вызывается вне функции, это дает правильный результат, но при попытке вызвать ту же функцию в функцииfoo() он производит пустой список, который делаетlen(lst()) значение 0. Я также попытался прокомментировать последние две строки, но все равно он возвращает пустой список. Что не так в приведенном выше коде?

Я сказал это только для того, чтобы проверить, что lst () возвращает ожидаемое значение. Alinwndrld
Вы комментируете первый вызов lst (), когда пытаетесь выполнить вызов в foo ()? olovb
Обратите внимание, что вы должны попробовать использоватьthe with statement для открытия файлов в Python. Он более читабелен и обеспечивает закрытие файла, даже если выдается исключение. Gareth Latty
@ Lattyware Пожалуйста, объясните с кодом, например. Alinwndrld
Почему тыopenИНГfin внеlst()? Johnsyweb

Ваш Ответ

4   ответа
1

read once что означает, что вы звонилиfin.read() до того, как более поздний fin.read () ничего не вернет.

исправить это по вызовуfin.seek(0) после вызова fin.read () или чтения файла в некоторый буфер.

7

fin былread(), вы больше не можете читать что-либо еще из файла, так как он уже достигEOF.

To read a file’s contents, call f.read(size), which reads some quantity of data and returns it as a string. size is an optional numeric argument. When size is omitted or negative, the entire contents of the file will be read and returned; it’s your problem if the file is twice as large as your machine’s memory. Otherwise, at most size bytes are read and returned. If the end of the file has been reached, f.read() will return an empty string ("").

http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects

Если вам действительно нужен реентерабельный доступ к вашему файлу, используйте:

def lst():
  fin.seek(0)
  return fin.readlines()
4

чтение еще этого файла приведет к возвращению пустой строки:

>>> example = open('foobar.txt')
>>> example.read()
'Foo Bar\n'
>>> example.read()
''

Другими словами, вы достигли конца файла. У вас есть три варианта здесь:

Re-open the file for each complete read.

Use .seek() to go to the start of the file again:

>>> example = open('foobar.txt')
>>> example.read()
'Foo Bar\n'
>>> example.seek(0)
>>> example.read()
'Foo Bar\n'

Store the contents of the file in a variable, thus caching it in memory, then use that instead of re-reading the file.

3

read() один разfin был прочитан.

Если хотитеread() снова (после того как содержимое будет удалено с первой попытки), вам потребуется повторноopen() или жеseek() начало файла.

Я предлагаю вам сделать это вlst()или, что еще лучше, хранить содержимое, возвращаемоеlst()

Помимо этого...

fin.write(str(len(lst()) + in)

Неясно, что вы пытаетесь сделать здесь, но вам лучше использовать сохраненное возвращаемое значение изlst() и не используяin в качестве имени переменной, поскольку оно является зарезервированнымkeyword.

Что-то вроде:

lines = lst()
# [...]
number_of_lines = len(lines)
fin.write(str(number_of_lines) + some_other_str)
Error: User Rate Limit Exceededbar = fin.read()Error: User Rate Limit Exceededfin.flush()Error: User Rate Limit Exceeded Alinwndrld
Error: User Rate Limit Exceeded()Error: User Rate Limit Exceeded Alinwndrld
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededfin.flushError: User Rate Limit Exceededfile.close()Error: User Rate Limit Exceeded Alinwndrld

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