我正在尝试解析一个具有不一致间距和重复行的大型文本文件。文件中的很多文本我不需要,但例如在一行中我可能需要 6 个项目,有些用逗号分隔,有些用空格分隔。
示例行:1 23456 John,Doe 366: F.7
我想要的(CSV格式):1 2456 John Doe 366 F.7(全部作为他们自己的单元格)
最终,我试图将输出获取到 CSV,并且希望我已经尝试在文件中逐行进行到目前为止,将我试图按其特定空间提取的组件分开,但我觉得有一个更好的方法。
import csv
def is_page_header(line):
return(line[0] == '1') and ("RUN DATE:" not in line)
def read_header(inFile):
while True:
line = inFile.readline()
if '************************' in line:
break
def is_rec_start(line):
try:
x = int(line[0:6])
return True
except:
return False
filename = r"TEXT_TEST.txt"
inFile = open(filename)
while True:
line = inFile.readline()
if line == "\n":
continue
elif line == "":
break
elif is_page_header(line):
read_header(inFile)
elif is_rec_start(line):
docketno = int(line[0:6])
fileno = line[8:20]
elif 'FINGERPRINTED' in line:
fingerprinted = True
else:
print(line)
最佳答案
您可以使用正则表达式
import re
import csv
pattern = re.compile("(\d+)\s+(\d+)\s*(\w+)\s*\,\s*(\w+)\s*(\d+)\s*\:\s*([\w\.]+)")
with open("TEXT_TEST.txt") as txt_file, open("CSV_TEST.csv", "w") as csv_file:
csv_writer = csv.writer(csv_file)
for line in txt_file:
g = pattern.findall(line)
if g: csv_writer.writerows(g)
(\d+)
:\d
匹配从 0 到 9 的任意数字,+
after 表示匹配一个或多个,()
用于捕获和提取信息以进行进一步处理。
\s+
:\s
匹配空白,+
一个或多个。
\s*
:*
之后\s
匹配零个或多个空格。
\w
: 用于匹配 A-Z
范围内的字符, a-z
, 0-9
[]
用于匹配特定字符,例如。 [abc]
只会匹配单个 a
, b
,或c
信,没有别的,所以[\w\.]
匹配A-Z
, a-z
, 0-9
或.
, \
之前.
用于转义正则表达式中具有特殊含义的字符。
关于python - 解析具有随机间距和重复文本的文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59142331/