我有一个 CSV 文件,该文件是我使用从 Check Point 防火墙策略导出的 HTML 创建的。 在某些情况下,每个规则都表示为多行。当规则具有多个地址源、目的地或服务时,就会发生这种情况。 我需要输出仅在一行中描述每条规则。 很容易区分每条规则的开始时间。第一列是规则 ID,它是一个数字。
这是一个例子。用绿色标记了应该移动的字符串:
让我给你举个例子:
NO.;NAME;SOURCE;DESTINATION;SERVICE;ACTION;
1;;fwgcluster;mcast_vrrp;vrrp;accept;
;;;;igmp;;
2;Testing;fwgcluster;fwgcluster;FireWall;accept;
;;fwmgmpe;fwmgmpe;ssh;;
;;fwmgm;fwmgm;;;
我需要的是,用伪代码解释,是这样的:
读取下一行的第一列。如果有一个数字: 评估下一行的第一列。如果那里没有数字,则连接(用逗号分隔)\ 将这一行各列中的字符串与最后一行相加,并删除当前行中的文本
输出应该是这样的:
NO.;NAME;SOURCE;DESTINATION;SERVICE;ACTION;
1;;fwgcluster;mcast_vrrp;vrrp-igmp;accept;
;;;;;;
2;Testing;fwgcluster-fwmgmpe-fwmgm;fwgcluster-fwmgmpe-fwmgm;FireWall-ssh;accept;
;;;;;;
The empty lines are there only to be more clear, I don't actually need them.
谢谢!
最佳答案
这应该可以帮助您入门
import csv
with open('data.txt', 'r') as f:
reader = csv.DictReader(f, delimiter=';')
for r in reader:
print r
编辑:鉴于您所需的输出,这应该可以让您接近目标。它有点粗糙,但可以满足您的大部分需求。它会检查“否”。键,如果它有值,它将开始一条记录。如果不是,它将将该行中的任何其他数据与记录中的等效数据连接起来。最后,当创建新记录时,旧记录会附加到结果中,这也会发生在最后捕获最后一项。
import csv
result, record = [], None
with open('data2.txt', 'r') as f:
reader = csv.DictReader(f, delimiter=';', lineterminator='\n')
for r in reader:
if r['NO.']:
if record:
result.append(record)
record = r
else:
for key in r.keys():
if r[key]:
record[key] = '-'.join([record[key], r[key]])
if record:
result.append(record)
print result
关于python - 将 CSV 文件的几行与防火墙规则合并,以便更轻松地解析它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19305778/