有人可以帮我解决这个问题吗?
我有以下原始文本文件:
============================
Line of text
Line 3: Port #: 12; Type: 5000AX-FG;
============================
- - Stage 1 - -
Duration: 0 hrs 0.60 min. Total Elapsed Time: 0 hrs 0.60 min.
Status: Done
...
- - Stage 8 - -
Line 66: Duration: 11 hrs 48.0 min. Total Elapsed Time: 16 hrs 35.6 min.
Line 67: Status: Done
我想解析类型(5000AX-FG),阶段8的持续时间和阶段8的状态。我的脚本也将遍历多个文件。我的问题是我很难理解正则表达式模块在Python中的工作原理。我在将它应用到我的情况时遇到了问题。任何建议都将不胜感激。
这是我到目前为止所做的:
#!/usr/bin/python
import glob
import re
import csv
list_of_files = glob.glob('*06*.rpt')
for fileName in list_of_files:
f=open(fileName, 'r')
print f
for i, line in enumerate(f):
if i == 2:
print line
elif i == 65:
print line
elif i == 66:
print line
f.close()
答案 0 :(得分:3)
如果您不了解正则表达式,并且不愿意学习它们,那就不要使用它们。没有它们,这很容易解析。
您要解析的第一行是:
"Line 3: Port #: 12; Type: 5000AX-FG;\n"
在英语中,您要做的是:
你可以明显地重新安排这些,将它们中的一些组合成一个步骤等等,但是让我们直接将它翻译成Python:
if i == 2:
line = line.rstrip() # 'Line 3: Port #: 12; Type: 5000AX-FG;'
words = line.split() # ['Line', '3:', 'Port', '#:', '12;', 'Type:', '5000AX-FG;']
last_word = line[-1] # '5000AX-FG;'
part_type = last_word.rstrip(';') # '5000AX-FG'
print part_type
如果你想变得更聪明,请注意线条内的图案,并使用它们进行分割。例如,在这一行中,以及所有类似的行:
Line 66: Duration: 11 hrs 48.0 min. Total Elapsed Time: 16 hrs 35.6 min.
他们都以"Line NN: "
开头。之后,有一个或多个键值对,其中的对由句点和可选的空格分隔,冒号和可选的空格分隔每个键和值。所以:
"Line NN: "
部分。'.'
:
周围分成两部分。你可以进一步概括它 - 制作所有键值对的字典,然后你可以在那个字典中查找你想要的那个。
例如:
def parse_line(line):
line = line.rstrip()
line = line.partition(':')[-1]
parts = line.split('.')
mapping = {}
for part in parts:
key, _, value = part.partition(':')
mapping[key.strip()] = value.strip()
return mapping
现在:
if i == 65:
mapping = parse_line(line)
print mapping['Duration']
答案 1 :(得分:1)
这样的东西?
import glob
def parse_files(list_of_files):
for fileName in list_of_files:
with open(fileName, 'r') as f:
f.readline()
f.readline()
line = f.readline()
#"Line 3: Port #: 12; Type: 5000AX-FG;\n"
yield line.split(';')[1].split(':')[1]
for result in parse_files(glob.glob('*06*.rpt')):
print(result)