Python解析包含ip和端口的csv文件

2024-04-26 10:18:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个解析csv文件的小项目

所以我正在处理的csv文件应该包含用逗号分隔开的端口的ip

192.168.10.45,80443,20,218080

192.168.10.49,22,80,21

所以,我试图读取这个文件,然后为每个端口写一个输出文件,其中包含该端口的IP地址。例如 22.txt应包含

192.168.10.45 192.168.10.49

你知道我怎么做吗?还是个好的推荐信。我在Python3号里还是个傻瓜

import csv
import sys

with open(sys.argv[1], 'rt') as f:
reader = csv.reader(f)
for row in reader:
    print((row)[1])

提前谢谢!在


Tags: 文件csv项目端口importiptxtwith
3条回答

我没有使用csv库,因为你的csv没有报头,并且有可变数量的开放端口。它更简单,代码/深度更少。这种方式。在

没有csv软件包的版本1

import os, sys
from collections import defaultdict

def main(csv):

    # use defaultdict so there is no need to initialize
    # use set to remove duplicate entries
    port_ip_map = defaultdict(set)

    # open with, handles errors open closing file handles etc.
    with open(csv, 'r') as f:
        # read lines
        lines = f.readlines()
        for line in lines:
            # ip must always be the first entry
            # port lists can have a variable length
            ip, *ports = line.split(',')
            for port in ports:
                # save ips by port
                port = int(port.strip())
                port_ip_map[port].add(ip)



    for port, ips in port_ip_map.items():
        line = ' '.join(ips)
        with open('{}.txt'.format(port), 'w') as f:
            f.write(line)




if __name__ == '__main__':
    # main(sys.argv[1])  # pass csv file by cli
    main('./test1.csv')

带有csv软件包的版本2

^{pr2}$

示例输入:test1.csv

192.168.10.49,22,80,21
192.168.10.45,80,443,20,21,8080

样本输出:

defaultdict(<class 'set'>, {22: {'192.168.10.49'}, 80: {'192.168.10.45', '192.168.10.49'}, 21: {'192.168.10.45', '192.168.10.49'}, 443: {'192.168.10.45'}, 20: {'192.168.10.45'}, 8080: {'192.168.10.45'}})

你应该考虑使用Python字典,或者dict。collections库中还有一个OrderedDict。在

例如:

    import collections

    ips_ordered_by_port = collections.OrderedDict()
    with open(sys.argv[1], 'rt') as f:
    reader = csv.reader(f)
    for row in reader:
        row_parts = row.split(',')
        ip = row_parts[0]
        for row_part_idx in range(1, len(row_parts)):
            port = row_parts[row_part_idx]
            ip_ordered_by_port = ips_ordered_by_port.get(port)
            if ip_ordered_by_port is None:
                ips_ordered_by_port[port] = ip
            else:
                ip_ordered_by_port.update(ip)

现在您将有一个按端口(键)排序的dict,对于每个键,项(值)将是ip地址。要遍历每个密钥,请为该密钥创建一个文件,并将我留给您的所有IP地址写入。在

当然,为了提高可读性和可测试性,可以将上述代码重构为几个函数。在

假设要查找的端口是脚本的第二个参数,则可以执行以下操作:

import csv
import sys

infile = sys.argv[1]
port = sys.argv[2]

with open(infile, 'rt') as f:
    reader = csv.reader(f)
    for row in reader:
        if port in row[1:]:
            print('{}:{}'.format(row[0], port))

在这里,对于文件中的每一行,if port in row[1:]将在列表的每个元素中查找端口。我想这就是你想要的?在

注意,我稍微修改了print行,以便也打印端口。在

相关问题 更多 >