如何找出一个文件是否是在其`eof`?如何找出一个文件是否是在其`eof`?(How to find

2019-05-13 12:19发布

fp = open("a.txt")
#do many things with fp

c = fp.read()
if c is None:
    print 'fp is at the eof'

除了上述方法,任何其他方式找出是否FP是已经在EOF?

Answer 1:

fp.read()读取到文件末尾,所以以后它的成功完成,你知道该文件是在EOF; 有没有必要检查。 如果不能达到EOF它会引发异常。

当读取数据块文件,而不是read() ,你知道你EOF击中时read返回小于你要求的字节数。 在这种情况下,下面的read调用将返回空字符串(不是None )。 下面的循环读取块的文件; 它会调用read最多一次太多。

assert n > 0
while True:
    chunk = fp.read(n)
    if chunk == '':
        break
    process(chunk)

或者,更短:

for chunk in iter(lambda: fp.read(n), ''):
    process(chunk)


Answer 2:

在“换别人”的设计往往被忽视。 请参阅: Python的文档“流程控制回路” :

with open('foobar.file', 'rb') as f:
    for line in f:
        foo()

    else:
        # No more lines to be read from file
        bar()


Answer 3:

我认为,从文件中读取是确定是否含有较多的数据最可靠的方法。 这可能是一个管道,或其他进程可能会被追加到数据文件等。

如果你知道这不是一个问题,你可以使用这样的:

f.tell() == os.fstat(f.fileno()).st_size


Answer 4:

When doing binary I/O the following method is useful:

while f.read(1):
    f.seek(-1,1)
    # whatever

The advantage is that sometimes you are processing a binary stream and do not know in advance how much you will need to read.



Answer 5:

你可以比较的返回值fp.tell()前和调用后read法。 如果他们返回相同的值,FP是EOF。

此外,我不认为你的例子代码实际工作。 该read方法就我所知,从来没有返回None ,但它确实在EOF返回一个空字符串。



Answer 6:

读返回碰到EOF时,一个空字符串。 文档是在这里 。



Answer 7:

由于蟒蛇回报上EOF空字符串,而不是“EOF”本身,你可以检查它的代码,写在这里

f1 = open("sample.txt")

while True:
    line = f1.readline()
    print line
    if ("" == line):
        print "file finished"
        break;


Answer 8:

f=open(file_name)
for line in f:
   print line


Answer 9:

如果文件是在非块模式打开,返回字节少比预期并不意味着它在EOF,我想说@ NPE的答案是最可靠的方法:

f.tell()== os.fstat(f.fileno())。st_size



Answer 10:

Python的阅读,如果到达EOF函数会返回一个空字符串



Answer 11:

我真的不明白为什么蟒仍然不具备这样的功能。 我也不赞成使用以下

f.tell() == os.fstat(f.fileno()).st_size

最主要的原因是f.tell()不容易对某些特殊条件下工作。

该方法对我的作品是像下面这样。 如果你有一些伪像下面

while not EOF(f):
     line = f.readline()
     " do something with line"

你可以将其替换为:

lines = iter(f.readlines())
while True:
     try:
        line = next(lines)
        " do something with line"
     except StopIteration:
        break

这种方法很简单,你不需要改变大多数你的代码。



Answer 12:

f = open(filename,'r')
f.seek(-1,2)     # go to the file end.
eof = f.tell()   # get the end of file location
f.seek(0,0)      # go back to file beginning

while(f.tell() != eof):
    <body>

您可以使用方法文件 征求(),告诉()来确定文件的末尾的位置。 一旦位置被发现,寻求回文件开始



Answer 13:

您可以使用tell()到达之后方法EOF通过调用readlines()方法,如下所示:

fp=open('file_name','r')
lines=fp.readlines()
eof=fp.tell() # here we store the pointer
              # indicating the end of the file in eof
fp.seek(0) # we bring the cursor at the begining of the file
if eof != fp.tell(): # we check if the cursor
     do_something()  # reaches the end of the file


Answer 14:

获取文件的EOF位置:

def get_eof_position(file_handle):
    original_position = file_handle.tell()
    eof_position = file_handle.seek(0, 2)
    file_handle.seek(original_position)
    return eof_position

与当前位置比较吧: get_eof_position == file_handle.tell()



Answer 15:

虽然我会亲自使用with语句来处理打开和关闭文件,在你从标准输入读取和需要跟踪的EOF异常,做这样的事情的情况下:

使用一个try-catch用EOFError为例外:

try:
    input_lines = ''
    for line in sys.stdin.readlines():
        input_lines += line             
except EOFError as e:
    print e


Answer 16:

在批量读取文件BATCH_SIZE行(最后一批可以短一些):

BATCH_SIZE = 1000  # lines

with open('/path/to/a/file') as fin:
    eof = False
    while eof is False:
        # We use an iterator to check later if it was fully realized. This
        # is a way to know if we reached the EOF.
        # NOTE: file.tell() can't be used with iterators.
        batch_range = iter(range(BATCH_SIZE))
        acc = [line for (_, line) in zip(batch_range, fin)]

        # DO SOMETHING WITH "acc"

        # If we still have something to iterate, we have read the whole
        # file.
        if any(batch_range):
            eof = True


Answer 17:

Python没有内置EOF检测功能,但该功能有两种方式可供选择: f.read(1)将返回b'' ,如果没有更多的要读取的字节。 这适用于文本和二进制文件。 第二种方法是使用f.tell()以查看是否当前寻找位置是在末端。 如果你想测试EOF不改变当前文件的位置,那么你需要额外的代码位。

下面是这两种实现。

使用诉说()方法

import os

def is_eof(f):
  cur = f.tell()    # save current position
  f.seek(0, os.SEEK_END)
  end = f.tell()    # find the size of file
  f.seek(cur, os.SEEK_SET)
  return cur == end

使用read()方法

def is_eof(f):
  s = f.read(1)
  if s != b'':    # restore position
    f.seek(-1, os.SEEK_CUR)
  return s == b''

如何使用本

while not is_eof(my_file):
    val = my_file.read(10)

与此代码播放 。



Answer 18:

我用这个函数:

# Returns True if End-Of-File is reached
def EOF(f):
    current_pos = f.tell()
    file_size = os.fstat(f.fileno()).st_size
    return current_pos >= file_size


Answer 19:

您可以使用下面的代码片段,以逐行读取,直到文件末尾:

line = obj.readline()
while(line != ''):
    # Do Something
    line = obj.readline()


文章来源: How to find out whether a file is at its `eof`?
标签: python file eof