相关疑难解决方法(0)

file.tell()不一致

有没有人碰巧知道为什么当你以这种方式迭代文件时:

输入:

f = open('test.txt', 'r')
for line in f:
    print "f.tell(): ",f.tell()
Run Code Online (Sandbox Code Playgroud)

输出:

f.tell(): 8192
f.tell(): 8192
f.tell(): 8192
f.tell(): 8192
Run Code Online (Sandbox Code Playgroud)

我一直从tell()获取错误的文件索引,但是,如果我使用readline,我会得到适当的tell()索引:

输入:

f = open('test.txt', 'r')
while True:
    line = f.readline()
    if (line == ''):
        break
    print "f.tell(): ",f.tell()
Run Code Online (Sandbox Code Playgroud)

输出:

f.tell(): 103
f.tell(): 107
f.tell(): 115
f.tell(): 124
Run Code Online (Sandbox Code Playgroud)

我正在运行python 2.7.1 BTW.

python file buffering python-2.7

40
推荐指数
2
解决办法
8154
查看次数

Python file.tell给出了错误的值位置

我试图使用Python从现有文件中提取许多位置.这是我当前提取位置的代码:

    self.fh = open( fileName , "r+")
    p = re.compile('regGen regPorSnip begin')
    for line in self.fh :
        if ( p.search(line) ):
            self.porSnipStartFPtr = self.fh.tell()
            sys.stdout.write("found regPorSnip")
Run Code Online (Sandbox Code Playgroud)

这个代码段重复了很多次(少了文件打开),具有不同的搜索值,似乎有效:我得到了正确的消息,变量有值.

但是,使用下面的代码,第一个写入位置是错误的,而后续写入位置是正确的:

    self.fh.seek(self.rstSnipStartFPtr,0)
    self.fh.write(str);
    sys.stdout.write("writing %s" % str )
    self.rstSnipStartFPtr = self.fh.tell()
Run Code Online (Sandbox Code Playgroud)

我已经读过,由于Python倾向于"提前读取",传递某些read/ readline选项fh会导致错误的判断值.我看到避免这种情况的一个建议是读取整个文件并重写它,这在我的应用程序中不是一个非常有吸引力的解决方案.

如果我将第一个代码段更改为:

  for line in self.fh.read() :
        if ( p.search(line) ):
            self.porSnipStartFPtr = self.fh.tell()
            sys.stdout.write("found regPorSnip")
Run Code Online (Sandbox Code Playgroud)

然后它似乎self.fh.read()只返回字符而不是整行.搜索从不匹配.这似乎也适用于此self.fh.readline().

我的结论是,fh.tell在写操作后查询时只返回有效的文件位置.

有没有办法在阅读/搜索时提取准确的文件位置?

谢谢.

python seek tell

4
推荐指数
1
解决办法
3089
查看次数

标签 统计

python ×2

buffering ×1

file ×1

python-2.7 ×1

seek ×1

tell ×1