【问题标题】:Create generator to read each line in text file in reverse order创建生成器以相反的顺序读取文本文件中的每一行
【发布时间】:2019-01-30 01:29:13
【问题描述】:

我正在尝试反向读取文本文件中的每一行。我正在尝试通过生成器来做到这一点。我写了parser_entries(),它接受一个可迭代的东西并返回行,并产生一个可迭代的东西,它一次返回行并产生一个已解析的条目(这必须是一个生成器)。

sample.txt:

2018/03/25-00:08:48.638553  508     7FF4A8F3D704     snononsonfvnosnovoosr
2018/03/25-10:08:48.985053 346K     7FE9D2D51706     ahelooa afoaona woom
2018/03/25-20:08:50.486601 1.5M     7FE9D3D41706     qojfcmqcacaeia
2018/03/25-24:08:50.980519  16K     7FE9BD1AF707     user: number is 93823004
2018/03/26-00:08:50.981908 1389     7FE9BDC2B707     user 7fb31ecfa700
2018/03/26-10:08:51.066967    0     7FE9BDC91700     Exit Status = 0x0
2018/03/26-15:08:51.066968    1     7FE9BDC91700     std:ZMD:

解决方案:

def parser_entries(lines=iter(reversed(list(file)))):
    line = lines.split('.', maxsplit=1)
    yield (line[0], line[1])

with open('a.txt') as f:
    lines = parser_entries(f)
    date_part, line = next(lines)

我在尝试我的解决方案时遇到以下错误:

line = lines.split('.', maxsplit=1)
AttributeError: '_io.BufferedReader' object has no attribute 'split'

【问题讨论】:

  • 你说你想反向迭代但是你想要的结果是第一行??
  • 您确定不希望.638553 出现在data_part 中吗?我相信这是秒的分数。
  • 当然,但错误是将生成器放置为默认参数值。在这里,我在考虑如何逐行向后读取文件。
  • @Primusa,对不起,这是个错误。更新了!
  • @martineau,是的,我确定我不希望 .638553 出现在 date_part 中。

标签: python split generator


【解决方案1】:

您可以使用序列切片来执行此操作,如下所示:

def my_generator(file_name):
    with open(file_name) as file:
        for line in reversed(tuple(file)):
            index = line.find('.')  # Find first occurrence of '.' character.
            if index > -1:  # Character found?
                yield line[:index], line[index:-1]
            else:
                pass  # Not sure what you want to happen...

for data_part, line in my_generator('a_sample.txt'):
    print('data_part: {!r}, line: {!r}'.format(data_part, line))

输出:

data_part: '2018/03/26-15:08:51', line: '.066968    1     7FE9BDC91700     std:ZMD:'
data_part: '2018/03/26-10:08:51', line: '.066967    0     7FE9BDC91700     Exit Status = 0x0'
data_part: '2018/03/26-00:08:50', line: '.981908 1389     7FE9BDC2B707     user 7fb31ecfa700'
data_part: '2018/03/25-24:08:50', line: '.980519  16K     7FE9BD1AF707     user: number is 93823004'
data_part: '2018/03/25-20:08:50', line: '.486601 1.5M     7FE9D3D41706     qojfcmqcacaeia'
data_part: '2018/03/25-10:08:48', line: '.985053 346K     7FE9D2D51706     ahelooa afoaona woom'
data_part: '2018/03/25-00:08:48', line: '.638553  508     7FF4A8F3D704     snononsonfvnosnovoosr'

【讨论】:

  • 感谢您的解决方案,但我不想通过常量来严格拆分,它可能会发生变化,因为这是来自日志的示例。有什么方法可以使用 spit() 吗?
  • 是的,split() 可以使用,如果您确定 . 不会出现在文件行的其他任何地方。还有其他可能性。颠倒文件行的顺序需要先将它们全部读入内存,可以吗?
  • 我不确定,它可能也用于其他地方。我们不能在 split() 中传递 maxsplit 参数吗?
  • user15051990:是的,使用maxsplit 可能会起作用,但我正在使用切片来分割我的答案——请参阅更新。
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多