3

我正在尝试打开一个文件并从最后一点读取。我的文件相当大(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() 中没有准确计算)。

4

1 回答 1

1

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

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

于 2012-06-18T23:54:24.137 回答