将文件中的块解析为不带换行符的Python列表

2024-05-15 17:47:46 发布

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

在一个包含许多内容的通用文件中有一个特定的内容块,该文件任意长,可以包含任何字符,每行以空格开头,并且在某些文本文件中具有格式:

 1\1\GINC-NODE9999\Scan\...
 ... ... ... ... ... ... ...
 ... ... ... ... ...\HF=-568
 .8880019,-568.2343213, -568
 .2343432, ... , -586.328492
 1\RMSD=...

我对介于\HF=和{}之间的特定序列感兴趣。我想把这些数字放到Python列表中。这个序列只是一系列用逗号分隔的数字,但是,这些数字可以滚动到第二行。另外,\HF=和{}可以通过滚动到新行上而断开。在

当前努力

我目前有以下情况:

^{pr2}$

列出了以下清单

['.6184082129,7.5129238742\\\\Version=EM64L-G09RevC.01\\
State=1-A\\HF=-568\n', ' .8880019,-568.8879907,-568.8879686,
-568.887937,-\n']

问题是我不仅在整个过程中有新行,而且还保存了比我应该保存的更多的数据。此外,滚动到其他行上的数字在列表中有自己的位置。我需要它看起来像

['-568.8880019', '-568.8879907', ... ]

Tags: 文件内容列表scan格式序列数字字符
3条回答

使用类似的方法将所有内容连接到一行:

with open(infile) as data:
    joined = ''.join(data.read().splitlines())

然后不用担心换行符来解析它。在

如果你的文件真的很大,你可能需要考虑另一种方法来避免把它都放在内存中。在

对于一个快速的解决方案,您可以实现基于正则表达式的简单字符串连接。在

我为你的数据格式实现了一个简短的解决方案。在

import re

def naiveDecimalExtractor(data):
    p = re.compile("(-?\d+)[\n\s]*(\d+\.\d+)[\n\s]*(\d+)")
    brokenNumbers = p.findall(data)

    return ["".join(n) for n in brokenNumbers]

data = """
1\1\GINC-NODE9999\Scan\...
 ... ... ... ... ... ... ...
 ... ... ... ... ...\HF=-568
 .8880019,-568.2343213, -568
 .2343432, ... , -586.328492
 1\RMSD=...
"""

print naiveDecimalExtractor(data)

谨致问候

和过去

多行非贪心正则表达式可用于提取介于\HF=和\RMSD=之间的文本。一旦文本被提取出来,它应该很容易标记成组成数字

import re
import os
pattern = r'''\HF=(.*?)\RMSD='''
pat = re.compile(pattern, re.DOTALL)
for number in pat.finditer(open('file.txt').read()):
    print number.group(1).replace(os.linesep, '').replace(' ', '').strip(r'''\\''')
... 
-568 .8880019,-568.2343213, -568 .2343432, ... , -586.328492 1\

相关问题 更多 >