python3 file.readline EOF?

时间:2017-06-30 21:30:24

标签: python-3.x file

我无法确定何时使用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中的文件末尾。任何帮助表示赞赏。谢谢!

5 个答案:

答案 0 :(得分:3)

fi.readline()检查是否达到EOF的最简单方法是检查返回值的真实性;

line = fi.readline()
if not line:
    dosomething() # EOF reached

推理

根据official documentation

<块引用>

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

根据Python Tutorial

  

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)