python 访问循环内的下一行
python access next line inside loop
输入数据如下:
crypto map outside_map0 1 set peer 1.1.1.1
crypto map outside_map0 1 ikev1 transform-set ESP-AES-256-SHA
crypto map outside_map0 2 set peer 2.2.2.2
crypto map outside_map0 2 ikev1 transform-set ESP-AES-256-SHA
crypto map outside_map0 3 set peer 3.3.3.3
crypto map outside_map0 3 ikev1 transform-set ESP-AES-256-SHA
crypto map outside_map0 4 set peer 4.4.4.4
crypto map outside_map0 4 ikev1 transform-set ESP-3DES-SHA
我希望我的输出数据如下所示:
1, 1.1.1.1, ESP-AES-256-SHA
2, 2.2.2.2, ESP-AES-256-SHA
3, 3.3.3.3, ESP-AES-256-SHA
4, 4.4.4.4, ESP-3DES-SHA
我当前的脚本是这样的:
fo = open('vpn.txt', 'r')
for line in fo.readlines():
list = line.split(" ")
if "peer" in list:
print list[3] + "," + list[6] + "," + next(list[6])
我很难理解下一个函数的用法。
可以使用 next
函数做您想做的事,但这不是解决此问题的最简单、最容易理解的方法。我不建议在这里尝试使用 next
。
你有一个 for
循环遍历文件中的行,但实际上你想一次读取两行,因为每个 "item" 数据取决于文件中的两行。我建议分三部分解决这个问题:
- 首先,设计一种将数据表示为对象(例如元组或 namedtuple)的方法。
- 编写一个
while
循环以一次读取文件的两行,从这两行中提取数据以创建一个对象,并将这些对象收集在一个列表中。
- 遍历对象列表,打印出每个对象所需的数据。
第 2 部分的解决方案可能如下所示:
results = []
with open('vpn.txt', 'r') as f:
line1, line2 = f.readline(), f.readline()
while line1 and line2:
_, _, _, id_number, _, _, ip_address = line1.split()
algorithm = line2.split()[-1]
obj = (id_number, ip_address, algorithm)
results.append(obj)
line1, line2 = f.readline(), f.readline()
您不能在 str 对象旁边使用。
这里是精确文件结构的解决方案
with open('vpn.txt', 'r') as fo
desired_line = ''
for line in fo:
list = line.split(" ")
if "peer" in list:
desired_line += list[3] + "," + list[6].strip()
else:
desired_line += ", " + line.split(' ')[6]
print(desired_line)
desired_line = ''
您可以使用 pandas 轻松完成此操作。据我所见,您的要求是获得第 4、6、7 列。我考虑过每列由 tab('\t') 分隔。您甚至可以使用 space.
我使用了虚拟列名。你可以使用合适的。
import pandas as pd
df = pd.read_csv('vpn.txt' , sep = '\t', header = None)
df.columns = ["A", "B", "C", "D", "E", "F", "G"]
OutputData = df[["D","F", "G"]]
OutputData.to_csv('vpn2.txt' , sep= '\t')
with open("vpn.txt") as f:
for index, (line1, line2) in enumerate(zip(f, f), start=1):
peer_ip = line1.split()[-1]
cipher_suite = line2.split()[-1]
print(index, peer_ip, cipher_suite, sep=', ')
看问题How do I read two lines from a file at a time using python
这只是获取每行的最后一个字,一次两行。你还想做一些错误检查,比如
if "peer" not in line1.split():
raise ValueError(f'Line {index} doesn\'t contain the word "peer", but it should: {line1}')
或尝试parse peer_ip
as an IP address
import ipaddress
def is_valid_ip_address(text):
try:
ipaddress.ipaddress(text)
return True
except ValueError:
return False
with open("vpn.txt") as f:
for index, (line1, line2) in enumerate(zip(f, f), start=1):
peer_ip = line1.split()[-1]
cipher_suite = line2.split()[-1]
if not is_valid_ip_address(peer_ip):
raise ValueError(
f'Line couldn\'t parse "{peer_ip}" as an IP address on line {index}'
)
print(index, peer_ip, cipher_suite, sep=", ")
输入数据如下:
crypto map outside_map0 1 set peer 1.1.1.1
crypto map outside_map0 1 ikev1 transform-set ESP-AES-256-SHA
crypto map outside_map0 2 set peer 2.2.2.2
crypto map outside_map0 2 ikev1 transform-set ESP-AES-256-SHA
crypto map outside_map0 3 set peer 3.3.3.3
crypto map outside_map0 3 ikev1 transform-set ESP-AES-256-SHA
crypto map outside_map0 4 set peer 4.4.4.4
crypto map outside_map0 4 ikev1 transform-set ESP-3DES-SHA
我希望我的输出数据如下所示:
1, 1.1.1.1, ESP-AES-256-SHA
2, 2.2.2.2, ESP-AES-256-SHA
3, 3.3.3.3, ESP-AES-256-SHA
4, 4.4.4.4, ESP-3DES-SHA
我当前的脚本是这样的:
fo = open('vpn.txt', 'r')
for line in fo.readlines():
list = line.split(" ")
if "peer" in list:
print list[3] + "," + list[6] + "," + next(list[6])
我很难理解下一个函数的用法。
可以使用 next
函数做您想做的事,但这不是解决此问题的最简单、最容易理解的方法。我不建议在这里尝试使用 next
。
你有一个 for
循环遍历文件中的行,但实际上你想一次读取两行,因为每个 "item" 数据取决于文件中的两行。我建议分三部分解决这个问题:
- 首先,设计一种将数据表示为对象(例如元组或 namedtuple)的方法。
- 编写一个
while
循环以一次读取文件的两行,从这两行中提取数据以创建一个对象,并将这些对象收集在一个列表中。 - 遍历对象列表,打印出每个对象所需的数据。
第 2 部分的解决方案可能如下所示:
results = []
with open('vpn.txt', 'r') as f:
line1, line2 = f.readline(), f.readline()
while line1 and line2:
_, _, _, id_number, _, _, ip_address = line1.split()
algorithm = line2.split()[-1]
obj = (id_number, ip_address, algorithm)
results.append(obj)
line1, line2 = f.readline(), f.readline()
您不能在 str 对象旁边使用。
这里是精确文件结构的解决方案
with open('vpn.txt', 'r') as fo
desired_line = ''
for line in fo:
list = line.split(" ")
if "peer" in list:
desired_line += list[3] + "," + list[6].strip()
else:
desired_line += ", " + line.split(' ')[6]
print(desired_line)
desired_line = ''
您可以使用 pandas 轻松完成此操作。据我所见,您的要求是获得第 4、6、7 列。我考虑过每列由 tab('\t') 分隔。您甚至可以使用 space.
我使用了虚拟列名。你可以使用合适的。
import pandas as pd
df = pd.read_csv('vpn.txt' , sep = '\t', header = None)
df.columns = ["A", "B", "C", "D", "E", "F", "G"]
OutputData = df[["D","F", "G"]]
OutputData.to_csv('vpn2.txt' , sep= '\t')
with open("vpn.txt") as f:
for index, (line1, line2) in enumerate(zip(f, f), start=1):
peer_ip = line1.split()[-1]
cipher_suite = line2.split()[-1]
print(index, peer_ip, cipher_suite, sep=', ')
看问题How do I read two lines from a file at a time using python
这只是获取每行的最后一个字,一次两行。你还想做一些错误检查,比如
if "peer" not in line1.split():
raise ValueError(f'Line {index} doesn\'t contain the word "peer", but it should: {line1}')
或尝试parse peer_ip
as an IP address
import ipaddress
def is_valid_ip_address(text):
try:
ipaddress.ipaddress(text)
return True
except ValueError:
return False
with open("vpn.txt") as f:
for index, (line1, line2) in enumerate(zip(f, f), start=1):
peer_ip = line1.split()[-1]
cipher_suite = line2.split()[-1]
if not is_valid_ip_address(peer_ip):
raise ValueError(
f'Line couldn\'t parse "{peer_ip}" as an IP address on line {index}'
)
print(index, peer_ip, cipher_suite, sep=", ")