Python seek() 后跟 readline() 给出空字符串

Python seek() followed by a readline() gives empty string

我正在使用与此处问题类似的内容:

Python: Undo a Python file readline() operation so file pointer is back in original state

但似乎行为不端。

我的代码:(运行时的值显示为注释)

def parse_shell(self, filename):
    output = None
    with open(self.shells_path + filename) as fp:
        first_line = fp.readline()
# first_line = 'Last login: Tue Jun  9 07:13:26 on ttys0'
        while len(string.split(first_line, '$')) == 1:
            last_pos = fp.tell()
            # last_pos = 43
            first_line = fp.readline()
# first_line =' 2015-06-09 08:18:23 [coryj@Corys-MacBook-Pro ~]$ ping 10.2.2.1'

        fp.seek(last_pos)
        for line in fp.readline():
            # line = ''
            line_chunks = string.split(line, '$')

根据文档,如果 readline() 到达 EOF,readline() 应该只 return 一个空字符串。 这个特定的文件超过 200k,所以我不明白为什么我会得到一个空字符串。

问题在于语句:
while len(string.split(first_line, '$')) == 1: 不能为 True,因此脚本永远不会进入 while 循环。 string.split() 将生成最少两个成员的列表,如 ["some",""],因此至少 len = 2。

此外,while 循环将 运行 while 语句 True,如果变为 False 则退出。

希望对您有所帮助!如果您觉得对您有用,请采纳我的回答。 :-)

就像 o11c 和劳伦斯说的:

for line in fp.readlines()有效

for line in fp有效

for line in fp.readline() 不是有效的结构。

我不明白 string.split 是什么?你是说 str.split 吗?从你正在尝试做的事情来看 - 看起来 - 你想将所有包含 $ 的行分成几部分并忽略其他行。在您的特定情况下,这些行似乎在文件的开头。一个更简单的方法是

for line in fp:
    if line.find('$') >= 0:
        line.split('$')  # or str.split(line, '$')

其他人已经指出了这一点,但仍然 - line in fp.readlines()line in fp.readline() 不同。前者将遍历列表中收集的文件的所有行,后者将仅遍历一行的所有字符。

您尝试做的是 line in fp.readline() 实际上是在尝试遍历该行的内容 - 这可能 不是您想要的

' 2015-06-09 08:18:23 [coryj@Corys-MacBook-Pro ~]$ ping 10.2.2.1'

所以改成line in fp(首选)或line in fp.readlines()。你应该很好

希望对您有所帮助。