2

例如,在 python 中,是这样的:

with open('myfile', 'rb') as f:
  f.seek(0, 2)  # seek to EOF
  file_size = f.tell()

  f.seek(file_size - 10)
  print f.read(10)

  f.seek(file_size - 20)
  print f.read(10)

  f.seek(file_size - 30)
  print f.read(10)
  ...

比这效率低的:

with open('myfile', 'rb') as f:
  f.seek(-10, 2)
  print f.read(10)

  f.seek(-20, 1)
  print f.read(10)

  f.seek(-20, 1)
  print f.read(10)
  ...
4

2 回答 2

4

文件中的读取位置是 OS 内核维护的简单索引;不涉及身体的头部运动。

C 代码从当前位置减去 10 或您在 python 中计算新位置将产生很小的差异。

于 2013-07-07T19:00:04.757 回答
1

read请注意,由于移动光标位置,程序并不相同!所以你想打电话f.seek(-20, 1),除非你想一遍又一遍地读取相同的 10 个字节。

此外,额外的调用ftell可能会使第一个调用(不知不觉地)变慢。您的程序之间的另一个区别是,如果在您阅读文件时正在写入文件,它们的行为会略有不同。

另请注意,您可以直接从 EOF 中查找,如下所示:

with open('myfile', 'rb') as f:
    f.seek(-10, 2) # Seek from EOF
    print(f.read(10))

    f.seek(-20, 1)
    print(f.read(10))

    f.seek(-20, 1)
    print(f.read(10))
于 2013-07-07T19:02:38.240 回答