Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析For循环中的下一行_Python_Csv - Fatal编程技术网

Python 解析For循环中的下一行

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

我要把输入的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
名单


假设您的数据是一个常规的字符串列表,如示例所示,您可以使用
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

至少将您想要的输出作为示例发布至少将您想要的输出作为示例发布