2013-05-04 4 views
-1

Если я печатаю это в Python:Python чтения() возвращает пустую строку

open("file","r").read() 

иногда возвращает точное содержимое файла в виде строки, некоторые другие времена, он возвращает пустую строку (даже если файл не пуст). Может кто-нибудь объяснить, от чего это зависит?

+4

'read' читает текущую позицию в файле. Он вернет пустую строку, если вы уже прочитали все содержимое (текущая позиция находится в конце). Если вы хотите снова прочитать файл, вам придется либо открыть его, либо «искать» до начала. –

+0

@Pavel Аносов Я знаю это. То же самое происходит, если я делаю: f = open («файл», «r»); f.read() –

+1

@FrancescoR. Тогда файл ** ** пуст. В противном случае вы получите некоторое содержимое кода и файла, которое мы можем использовать для воспроизведения вашей проблемы. – Bakuriu

ответ

3

Из документации file.read() method:

пустая строка возвращается, когда EOF немедленно столкнулся.

Вы попали в конец файлового объекта, больше нет данных для чтения. Файлы сохраняют «текущую позицию», указатель на данные файла, который начинается с 0 и увеличивается при чтении dada.

См. file.tell() method, чтобы прочитать это положение, и file.seek() method, чтобы изменить его.

+0

Я проверил файлы, которые я использовал, и все они были пусты. извините, моя ошибка –

+0

Правильно, в этом случае EOF (End Of File) находится в начале, позиция 0. –

10

Когда вы дойдете до конца файла (EOF), метод .read возвращает '', так как больше нет данных для чтения.

>>> f = open('my_file.txt') 
>>> f.read() # you read the entire file 
'My File has data.' 
>>> f.read() # you've reached the end of the file 
'' 
>>> f.tell() # give my current position at file 
17 
>>> f.seek(0) # Go back to the starting position 
>>> f.read() # and read the file again 
'My File has data.' 

Doc ссылка: read()tell()seek()

Примечание: Если это происходит в первый раз, когда Вы читаете файл, убедитесь, что файл не пуст. Если это не попытка поставить file.seek(0) перед read.

+0

Я проверил файлы, которые использовал, и все они были пусты. Извините моя ошибка –

0

Есть еще одна проблема, и это может быть связано с тем, что сам файл может быть просочился и только утерян или даже никогда не будет сборщиком мусора. Поэтому использовать с-заявление:

with open(...) as file: 
    data = file.read() 

Это трудно переварить для тех, кто с C-иш фоне (C, C++, Java, C# и, вероятно, другие), потому что отступы всегда создает новую область и любые переменные, объявленные в этой области, недоступны для внешних. В Python это просто не так, но сначала вы должны привыкнуть к этому стилю ...

Смежные вопросы