我正在收集输入的IP列表及其相应的票号并将其转换为csv。每个IP的票据都位于列表中IP下面的行上,那么我如何读取IP,解析其下面的票号,并以CSV格式打印这些值?
我的代码和IP / Tix#列表如下。
m = re.search(r'(\d{1,3}.){3}\d{1,3}(-\d{2}|slash\d{2})?',item, re.M|re.I)
n = re.search(r'10A-\d{6}',item, re.M|re.I)
for line in fiEsccb:
if m in line:
#go to below line and extract n (possibly multiple)
print m + ',' + n
列表
8.8.8.8
Open Menu 10A-002671 10/21/2016
8.8.8.8
10A-003079
8.8.8.8
10A-003179 10A-003178 10A-003172 10A-003171 10A-003170
8.8.8.8
10A-002970
8.8.8.8
10A-002970
答案 0 :(得分:0)
假设您的数据是常规字符串列表,如示例所示,您可以使用itertools
将其分组为三元组列表:
import itertools
data = ['8.8.8.8', 'Open Menu 10A-002671 10/21/2016', '', '8.8.8.8', '10A-003079', '', '8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', ''] # Add more lines
args=[iter(data)]*3
collected = list(itertools.zip_longest(*args, fillvalue=''))
print(collected)
# [('8.8.8.8', 'Open Menu 10A-002671 10/21/2016', ''), ('8.8.8.8', '10A-003079', ''), ('8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', '')]
此列表可以轻松保存为CSV格式。
答案 1 :(得分:0)
您可以尝试使用while True
循环和readline()
:
while True:
line1 = fiEsccb.readline()
if m in line1:
line2 = fiEsccb.readline()
if n in line2:
print m + ',' + line2
答案 2 :(得分:0)
您可以使用以下正则表达式从输入ip texfile中的数据生成列表,然后将其写入csv:
import csv,re
ippattern = r'\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}'
packetpattern = r'10A-\d{6}'
data = []
with open(r"C:\ipinfo.txt", 'rb') as ipfile:
lines = ipfile.readlines()
for line in lines:
if re.search(ippattern,line):
ip = re.findall(ippattern,line)[0]
packet = re.findall(packetpattern,lines[lines.index(line)+1])[0]
data.append([ip,packet])
with open(r"C:\ipinfo_output.csv", 'wb') as ipout:
writer = csv.writer(ipout)
writer.writerows(data)
输出csv:
8.8.8.8,10A-002671
8.8.8.8,10A-002671
8.8.8.8,10A-002671
8.8.8.8,10A-002970
8.8.8.8,10A-002671
这种方法产生了几个重复,我认为这是不必要的。为了避免这种情况,您可以使用字典,其中ip是字典键,数据包是字典值。然后将此字典写入csv文件。
或者您可以将此重复的csv文件导入excel,并通过remove duplicates
选项卡中的microsoft excel中的一个命令Data
删除重复项。
答案 3 :(得分:0)
如果我正确理解您的问题,您必须为整行应用IP的正则表达式,并为以下行中的项目的票号应用正则表达式:
import re
reIP = r'(\d{1,3}.){3}\d{1,3}(-\d{2}|slash\d{2})?'
reTicketNr = r'10A-\d{6}'
for line in fiEsccb:
line = line.strip()
if line == '': continue
mg = re.match(reIP,line)
if mg:
ip = mg.group(0)
else:
possibleTicketNrs = line.split()
for item in possibleTicketNrs:
if re.match(reTicketNr,item):
print(','.join([ip,item]))
使用
fiEsccb = ['8.8.8.8', 'Open Menu 10A-002671 10/21/2016', '', '8.8.8.8', '10A-003079', '', '8.8.8.8', '10A-003179 10A-003178 10A-003172 10A-003171 10A-003170', '']
你会得到:
8.8.8.8,10A-002671
8.8.8.8,10A-003079
8.8.8.8,10A-003179
8.8.8.8,10A-003178
8.8.8.8,10A-003172
8.8.8.8,10A-003171
8.8.8.8,10A-003170