开发者

Why the second time I run "readlines" on the same file nothing is returned?

开发者 https://www.devze.com 2023-01-12 02:16 出处:网络
>>> f = open(\'/tmp/version.txt\', \'r\') >>> f <open file \'/tmp/version.txt\', mode \'r\' at 0xb788e2e0>
>>> f = open('/tmp/version.txt', 'r')
>>> f
<open file '/tmp/version.txt', mode 'r' at 0xb788e2e0>
>>> f.readlines()
['2.3.4\n']
>>> f.rea开发者_JAVA百科dlines()
[]
>>>

I've tried this in Python's interpreter. Why does this happen?


You need to seek to the beginning of the file. Use f.seek(0) to return to the begining:

>>> f = open('/tmp/version.txt', 'r')
>>> f
<open file '/tmp/version.txt', mode 'r' at 0xb788e2e0>
>>> f.readlines()
['2.3.4\n']
>>> f.seek(0)
>>> f.readlines()
['2.3.4\n']
>>>


Python keeps track of where you are in the file. When you're at the end, it doesn't automatically roll back over. Try f.seek(0).


The important part to understand that some of the other posters don't explicitly state is that files are read with a cursor that marks the current position in the file. So on the first readlines() call the cursor is at the beginning of your file, and is progressed all the way to the end of the file since all the files data was returned. On the second readlines call the cursor is at the end of the file, so when it reads to the end of the file, it doesn't move at all, and no data is returned. For educational purposes, you could write a quick bit of code that would open a file, read a few bytes or lines out, and then call readlines(), you will see that the output of the readlines() call begins where you left off with your previous reads, and continues until the end of the file.

The seek(0) call mentioned by other will allow you to reset the cursor at the beginning of the file to start over with the reads.


In addition to seeking to the beginning of the file, you can also store the value as something that you can reuse later if you just need them in memory. Something like this:

with open('tmp/version.txt', 'r') as f:
  lines = f.readlines()

The with statement is new in 2.6 I believe, in prior versions you'd need to import it from future.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号