Python 解析For循环中的下一行
我要把输入的IP列表和相应的票号转换成csv。每个IP的票证位于列表中IP下方的行上,因此我如何读取IP,解析其下方的票证号,并以CSV格式打印这两个值 我的代码和IP/Tix的列表如下Python 解析For循环中的下一行,python,csv,Python,Csv,我要把输入的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
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
名单
假设您的数据是一个常规的字符串列表,如示例所示,您可以使用
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。假设您的数据是一个常规字符串列表,如示例所示,您可以使用
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。您可以尝试使用while True
循环和readline()
:
while True:
line1 = fiEsccb.readline()
if m in line1:
line2 = fiEsccb.readline()
if n in line2:
print m + ',' + line2
您可以尝试使用while True
循环和readline()
,如下所示:
while True:
line1 = fiEsccb.readline()
if m in line1:
line2 = fiEsccb.readline()
if n in line2:
print m + ',' + line2
您可以使用以下正则表达式从输入ip文件的数据生成列表,然后将其写入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
这种方法会产生一些我认为不必要的重复。为了避免这种情况,您可以使用dictionary,其中ip是dictionary键,packet是dictionary值。然后将此字典写入csv文件
或者,您可以将此重复的csv文件导入excel,并通过microsoft excel中的数据选项卡中的删除重复项来删除重复项。您可以使用以下正则表达式从输入ip文件的数据生成列表,然后将其写入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
这种方法会产生一些我认为不必要的重复。为了避免这种情况,您可以使用dictionary,其中ip是dictionary键,packet是dictionary值。然后将此字典写入csv文件
或者,您可以将此重复的csv文件导入excel并通过microsoft excel中的数据选项卡中的删除重复项来删除重复项。如果我正确理解您的问题,您必须为整行应用IPs正则表达式,为以下行的项目应用票证号正则表达式:
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]))
与
您将获得:
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
如果我正确理解您的问题,您必须为整行的IPs应用正则表达式,为以下行的项目应用票号正则表达式:
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]))
与
您将获得:
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
至少将您想要的输出作为示例发布至少将您想要的输出作为示例发布