【问题标题】:Read file in blocks with custom divider in python在python中使用自定义分隔符读取块中的文件
【发布时间】:2014-11-07 22:59:12
【问题描述】:

如何在 python 中轻松处理 txt 文件中的块?

我想把它转换成 XML 格式。

我已经写的(它没有显示前 TY 行...):

#!/usr/bin/python

import re

sample = """
TY  - RPRT2
A1  - Peter
T1  - Something
ER  -

TY  - RPRT3
A1  - Peter2
T1  - Something else
ER  -

TY  - RPRT4
A1  - Peter3
T1  - Similar
ER  -
"""

def blocks2(text):
  """Only non-comment blocks *between* comments"""
  buff = []
  for line in text.split('\n'):
    if line.startswith('TY  -'):
      if buff:
        yield "\n".join(buff)
        buff = []
    else:
        buff.append(line)
  if buff:
   yield "\n".join(buff)

for block in blocks2(sample):
  print "Block:\n%s" % (block)

【问题讨论】:

  • 你真的写过python来尝试这个吗?
  • 是的,抱歉,忘记粘贴了。

标签: python block


【解决方案1】:
print sample.split("\n\n")

我认为可行...

或许

 filter(str.strip,map(lambda x:x.rsplit("TY -",1)[-1],sample.split("ER  -")))

【讨论】:

  • 但我需要检查“TY -”和“ER -”之间的块。我想检查一下这个块中的语法,如果不行就跳过它。
【解决方案2】:

我假设您想按照以下要求处理每个块的 txt 文件块:

  • 块的第一行有一个前缀TI -
  • 最后一行只有ER -
  • 一个块可能包含带有前缀A1 -T1 -的行
  • 一个块的每个前缀不应包含多于一行。

您可以使用条件变量来构造字典。假设 fd 是文件对象或行列表:

inbloc = False
for line in fd:
    if inbloc:
        if line.startswith('A1  -'):
            if 'A1' in bloc:
                inbloc = False
            else:
                bloc['A1'] = line[5:].strip()
        elif line.startswith('T1  -'):
            if 'T1' in bloc:
                inbloc = False
            else:
                bloc['T1'] = line[5:].strip()
        elif line.strip() == 'ER  -':
            # process bloc
            print (bloc)
        else:
            inbloc = False
    elif line.startswith('TY  -'):
        bloc = { 'TY' : line[5:].strip() }

以您的sample 字符串作为输入,这给出:

{'A1': 'Peter', 'T1': 'Something', 'TY': 'RPRT2'}
{'A1': 'Peter2', 'T1': 'Something else', 'TY': 'RPRT3'}
{'A1': 'Peter3', 'T1': 'Similar', 'TY': 'RPRT4'}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2013-11-05
    相关资源
    最近更新 更多