【问题标题】:Python seek() followed by a readline() gives empty stringPython seek() 后跟 readline() 给出空字符串
【发布时间】:2015-09-14 00:36:02
【问题描述】:

我在这里使用类似于问题的东西:

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

但似乎行为不端。

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

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,所以我不明白为什么我会得到一个空字符串。

【问题讨论】:

  • for line in fp.readline() 完全是假的
  • 正如@o11c 所说,for line in fp.readline() 会给你行中的字符。所以第一个字符是空格。尝试将其更改为fore lin in fp:
  • 这确实似乎是问题所在。如果你们中的一位先生或另一位先生愿意将其写为答案,我将非常乐意接受。
  • @user916499 顺便说一句,您可以回答自己的问题。 you even get a badge for it如果你得到足够的支持
  • 无关:first_line 是一个误导性名称。你可以改用lines_with_dollar = (line for line in file if '$' in line)

标签: python seek


【解决方案1】:

我不明白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()。你应该很好

希望对您有所帮助。

【讨论】:

  • 这意味着解析一个不确定长度的 shell 会话日志,找出哪些行是命令,它们何时运行,以及这些命令的输出是什么。然后将所有内容放入数据库中,以便可以按时间搜索。我现在选择了line in fp。我还有十亿个边缘案例要处理,但我正在取得进展。
  • 使用if '$' in line: 而不是if line.find('$') >= 0:
【解决方案2】:

就像 o11c 和劳伦斯说的:

for line in fp.readlines() 有效

for line in fp 有效

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

【讨论】:

    【解决方案3】:

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

    此外,while 循环将在语句 True 时运行,并在变为 False 时退出。

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

    【讨论】:

    • 字符串。如果未找到 $, split 将返回一个元素。我这样做是为了跳过从顶部到第一个带有 $ 的所有行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2013-02-15
    • 1970-01-01
    • 2013-05-16
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多