0

我正在尝试索引一个巨大的文件,每行包含 5 列。第一列将成为键并且已排序(假设我们只有 17 个)。我想生成一个字典,告诉每个键值的起始位置。所以我要做的是:

fmaps = open('file.txt','r')
pos = fmaps.tell()
ln = fmaps.readline()
chrDict = {ln.split()[0]:pos}



for ln in fmaps:

    if not chrDict.has_key(ln.split()[0]):
           pos = fmaps.tell() 
           chrDict[ln.split()[0]] = pos

但是,当我尝试打开文件并

f = open('file.txt','r')
f.seek(val)
print f.readline()

我看到除了第一个位置是从一开始的 0 字节之外,位置完全偏离了这一点。

有谁知道 for 循环中的迭代对文件中的位置有什么影响?

4

2 回答 2

1

当使用文件对象作为迭代器时,Python 会进行内部缓冲,这会扭曲tell() 的结果。继续使用 readline 代替。还,

(编辑:哎呀,我第一次没有正确阅读您的问题!)

  • 遵循@falsetru 的建议并阅读二进制文件
  • 你不需要特例第一次阅读

这应该做的工作:

chrDict = {}
with open('file.txt','rb') as fmaps:
    while True:
        pos = fmaps.tell()
        ln = fmaps.readline()
        if not ln:
            break
        key = ln.split()[0]
        if key not in chrDict:
            chrDict[key] = pos
于 2013-10-21T15:54:22.377 回答
0

根据file.tell文件

注意在 Windows 上,读取具有 Unix 样式行尾的文件时,tell()可能会返回非法值(在 之后)。fgets()使用二进制模式 ( 'rb') 来规避这个问题。

将模式替换'r''rb'

于 2013-10-21T15:13:26.220 回答