如何让tell()工作

时间:2012-06-18 23:27:26

标签: python python-2.7

我正在尝试打开一个文件并从最后一点读取。我的文件相当大(20 Mb到~1 Gb)经过一些研究后,似乎tell()和seek()将是执行此操作的最有效方法之一。我试过以下代码

opened = open(filename, "rU")   
f1 = csv.reader(opened)
k = []
for line in f1:
    k.append(opened.tell())

当我这样做时,列表中的每个值都是8272 Long。这是否意味着我无法使用此实现?有什么我想念的吗?谢谢你的帮助!

我在Windows 7中运行python 2.7

更新

将拼凑好的所有内容拼凑在一起并反复试验后,我得到以下代码

opened = open(filename, "rU")   
k = [0]
where = 1
for switch in opened:
    where += len(switch) + 1
    f = StringIO.StringIO(switch)
    interesting = csv.reader(f, delimiter=',')
    good_values = interesting.next()
    k.append(where)

return k

这允许用户确切地知道文件中的位置,同时仍然能够根据其格式对其进行解析。我不完全确定为什么需要不断添加偏移量(看起来新行在len()中没有准确说明)。

1 个答案:

答案 0 :(得分:1)

看起来csv.reader正在以8272字节的块读取文件,这就是为什么你看到这个数字从opened.tell()多次返回 - 直到我猜你已经读过所有的行您的文件范围为0-8272。之后你会看到8272 * 2几次,确切的数字将取决于读取缓冲区中行的长度。

所以,基本上,在您的程序中,tell()并没有为您提供新CSV行的偏移,正如您所假设的那样。它只告诉您当前读取的文件区域末尾的偏移量,该偏移量是用于实现Python IO函数的系统函数所使用的内部OS缓冲区。