我无法确定何时使用file.readline
在python中到达文件的末尾fi = open('myfile.txt', 'r')
line = fi.readline()
if line == EOF: //or something similar
dosomething()
c = fp.read() 如果c为None: 将无法工作,因为那样我将在下一行中丢失数据,如果一行只有一个回车符,我将错过一个空行。
我看了几十个或相关的帖子,他们都只是使用刚刚完成时会破坏的固有循环。我没有循环,所以这对我不起作用。另外,我在GB中的文件大小有数百行的100个。脚本可能需要花费数天时间处理文件。所以我需要知道如何告诉我何时在python3中的文件末尾。任何帮助表示赞赏。谢谢!
答案 0 :(得分:3)
用fi.readline()
检查是否达到EOF的最简单方法是检查返回值的真实性;
line = fi.readline()
if not line:
dosomething() # EOF reached
f.readline()
从文件中读取一行;换行符 (\n
) 留在字符串的末尾,如果文件不以换行符结尾,则仅在文件的最后一行省略。这使得返回值明确; 如果 f.readline()
返回一个空字符串,则表示已到达文件末尾,而一个空行由 '\n'
表示,该字符串仅包含一个换行符。 >
python 中唯一的 falsy 字符串是空字符串 (''
)。
答案 1 :(得分:2)
我遇到了同样的问题。我的具体问题是迭代两个文件,其中较短的文件应该只读取较长文件的特定读取行。
正如这里提到的那样,逐行迭代的自然pythonic方法就是迭代。我坚持这种“自然性”的解决方案是手动利用文件的迭代器属性。像这样:
with open('myfile') as lines:
try:
while True: #Just to fake a lot of readlines and hit the end
current = next(lines)
except StopIteration:
print('EOF!')
你当然可以使用自己的IOWrapper类来修饰它,但这对我来说已经足够了。只需将对readline
的所有来电替换为next
来电,并且不要忘记抓住StopIteration
。
答案 2 :(得分:1)
这是使用f.tell()
和f.read()
包含大量数据的示例:
假设我的input.txt
文件包含:
hello
hi
hoo
foo
bar
测试:
with open('input.txt', 'r') as f:
# Read chunk of data
chunk = 4
while True:
line = f.read(chunk)
if not line:
line = "i've read Nothing"
print("EOF reached. What i read when i reach EOF:", line)
break
else:
print('Read: {} at position: {}'.format(line.replace('\n', ''), f.tell()))
将输出:
Read: hell at position: 4
Read: ohi at position: 9
Read: hoo at position: 14
Read: foo at position: 19
Read: bar at position: 24
EOF reached. What i read when i reach EOF: i've read Nothing
答案 3 :(得分:1)
您可以使用tell()
函数的输出来确定最后readline
是否更改了流的当前位置。
fi = open('myfile.txt', 'r')
pos = fi.tell()
while (True):
li = fi.readline()
newpos = fi.tell()
if newpos == pos: # stream position hasn't changed -> EOF
break
else:
pos = newpos
f.tell()返回一个整数,给出文件对象在文件中的当前位置,表示为二进制模式下文件开头的字节数和文本模式下的不透明数字。
...
在文本文件(那些在模式字符串中没有ab打开的文件)中,只允许相对于文件开头的搜索(异常是寻求到文件末尾的搜索(0,2))并且唯一有效偏移值是从f.tell()返回的值,或零。
由于tell()
返回的值可用于seek()
,因此它们必须是唯一的(即使我们无法保证它们对应的内容)。因此,如果tell()
之前和之后readline()
的值不变,则流位置不变,并且已达到EOF(当然还有其他一些I / O异常)。读取一个空行将至少读取换行符并推进流的位置。
答案 4 :(得分:0)
with open(FILE_PATH, 'r') as fi:
for line in iter(fi.readline, ''):
parse(line)