Python seek()后跟readline()提供空字符串

2024-05-16 01:19:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是类似于这里的问题:

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时返回空字符串。 这个特定的文件超过200k,所以我不明白为什么我会得到一个空字符串。在


Tags: 字符串inposselfreadlinestringlinefilename
3条回答

问题是这句话:
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()实际上是在尝试迭代行的内容-这可能是您想要的而不是。在

^{pr2}$

所以把它改成line in fp(首选)或line in fp.readlines()。你应该是好人

希望有帮助。在

相关问题 更多 >