因此,在发布此问题之前,我发现了一个与我的问题类似但不完全相同的问题。 How to parse this text file format into CSV format?
我有一个需要解析的文本文件。
凭单号码:2423
原始来源IPIP:1.1.1.1
旧货源:50
主机IP:2.2.2.2
主机端口:52
探索:SomeRANDOM利用
一堆随机的电子邮件标头垃圾
票号:2423
原始来源IPIP:1.1.1.1
旧货源:50
主机IP:2.2.2.2
主机端口:52
探索:SomeRANDOM利用
我想解析所有“随机电子邮件标头垃圾堆”
解析之后,我想格式化要在CSV文件中读取的文本并创建Headers,然后仅将下面的数据导入列中。最终结果应如下所示:
凭单编号,旧来源IPIP,旧来源端口,主机IP,主机端口,开发
2423、1.1.1.1、50、2.2.2.2、52,SomeRANDOMexploit
2423,1.1.1.1,50,2.2.2.2,52,SomeRANDOMexploit
我找到了一种使用以下代码解析行的方法:
import re
filename = "./input.txt"
infile = open(filename, 'r')
lines = infile.readlines()
lines[0:13]
for line in lines:
if re.match("TICKET NUMBER|OLD SOURCE IP|OLD SOURCE PORT|HOST IP|HOST PORT|EXPLOIT", line):
print(line.strip())
infile.close()
摆脱了电子邮件标题垃圾。
我只是不知道如何获取数据,然后将其格式化为CSV格式,冒号可以将其定界并将Headers放在列的顶部。
import csv
with open('output.txt', 'r') as in_file:
stripped = [line.replace(":","").split() for line in in_file]
zipped = zip([stripped]*1)
with open('out_file.csv', 'w') as out_file:
writer = csv.writer(out_file)
writer.writerow(('TICKET NUMBER', 'OLD SOURCE IPIP', 'OLD SOURCE PORT', 'HOST IP', 'HOST PORT', 'EXPLOIT'))
for group in zipped:
writer.writerows(group)
上面的代码使我可以很好地编写Header,但它会将文本文件中的所有内容打印到同一行的单独列中
输出
TICKET NUMBER, OLD SOURCE IPIP, OLD SOURCE PORT, HOST IP, HOST PORT, EXPLOIT
['TICKET', 'NUMBER2423'] ['OLD', 'SOURCE', 'IPIP', '1.1.1.1'] ['OLD', 'SOURCE', 'PORT', '50'] ['HOST', 'IP2.2.2.2'] ['HOST', 'PORT'] ['EXPLOITSomeRANDOMexploit'] ['TICKET', 'NUMBER2423'] ['OLD', 'SOURCE', 'IPIP', '1.1.1.1'] ['OLD', 'SOURCE', 'PORT', '50'] ['HOST', 'IP2.2.2.2'] ['HOST', 'PORT'] ['EXPLOITSomeRANDOMexploit']
所需的输出
TICKET NUMBER, OLD SOURCE IPIP, OLD SOURCE PORT, HOST IP, HOST PORT, EXPLOIT
2423, 1.1.1.1, 50, 2.2.2.2, 52, SomeRANDOMexploit
2423, 1.1.1.1, 50, 2.2.2.2, 52, SomeRANDOMexploit
据我了解,代码将冒号替换为空,然后将两个单词合并为一个。另外,我也不知道如何使它们打印到新行。
答案 0 :(得分:0)
您可以利用Python DictWriter
来解决此问题。每个匹配的行都可以分配给一个行字典。如果发现不匹配的行,则可以写入该行。如果缺少其中一个字段,则使用restval
。
例如:
import csv
import re
fields = ["TICKET NUMBER", "OLD SOURCE IPIP", "OLD SOURCE PORT", "HOST IP", "HOST PORT", "EXPLOIT"]
re_valid_field = re.compile('|'.join(fields))
with open('input.txt') as f_input, open('output.csv', 'w', newline='') as f_output:
csv_output = csv.DictWriter(f_output, fieldnames=fields, restval='')
csv_output.writeheader()
row = {}
for line in f_input:
if re_valid_field.match(line):
key, sep, value = line.strip().partition(':')
row[key.strip()] = value.strip()
elif row:
csv_output.writerow(row)
row = {}
# Any remaining row to be written?
if row:
csv_output.writerow(row)
这将创建output.csv
,如下所示:
TICKET NUMBER,OLD SOURCE IPIP,OLD SOURCE PORT,HOST IP,HOST PORT,EXPLOIT
2423,1.1.1.1,50,2.2.2.2,52,SomeRANDOMexploit
2423,1.1.1.1,50,2.2.2.2,52,SomeRANDOMexploit