用于将IPv6地址转换为数字(或字符串)的大型CSV文件的脚本



所以我有一个大的csv文件,超过1gb。在ipv4和ipv6中有一列IP地址。我想把ipv6地址转换成数字,但libre calc的行太多了。所以我想知道是否可以在终端中使用python来转换所有的ipv6地址。

此外,我可以将文件分割成更小的部分,然后使用libre-calc,但同样的问题是——我也不知道如何编写脚本。

编辑:

我不介意,不过可能会变得更复杂。也不确定应该如何格式化,但我希望人们能明白。。。因此,我有一个表,其中包含IPv6地址,如以下示例:

2001:db8::cafe:1111
2001:db8:0:a:1:2:3:4
2001:db8:aaaa::c
2001:db8:0:0:1::4

有很多不同的规则来管理格式——对我来说太难了。我听说python有一个函数会专门返回转换,但不确定其余的(如何在格式不中断的情况下将返回的值正确地返回到csv中,等等(。总之,这是另一个表中的一行:

"58569107296622255421594597096899477504","58569107375850417935858934690443427839","NG","Nigeria","Abuja Federal Capital Territory","Abuja","9.057350","7.489760"

所以我需要匹配的部分是前两个数字(前两列(,其中有几个范围

"0","340282366920938463463374607431768211455"

所以我想获取IPv6地址,将它们转换为IP号码,然后将它们排序到各自的范围中。

是的,这是您可以在Python中执行的操作。我将用一些简短的片段和文档链接进行演示,这些片段和链接将无法提供完整的解决方案,而有利于为您提供自己组装所需的资源。

首先,如果你想逐行加载一个CSV文件并写入第二个文件,你可以这样做:

>>> import csv
>>> with open('eggs.csv', newline='') as in and open('omellette.csv', 'w') as out:
...     r = csv.reader(in)
...     w = csv.writer(out)
...     for row in r:
...         print(', '.join(row)) # print unmodified
...         row[0] = ipToNum(row[0])
...         row[1] = ipToNum(row[1])
...         print(', '.join(row)) # print modified
...         w.writerow(row)
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

这个例子所基于的原始文件以及关于python内置CSV功能的其他信息可以在这里找到:

  • https://docs.python.org/3/library/csv.html

您可能需要根据特定CSV文件的确切格式进行调整。现在,要将IP地址转换为数字,您可以执行以下操作:

import socket, struct
def ipToNum(ip):
"convert ipv4/6 string to long integer"
return struct.unpack('>L',socket.inet_pton(ip))[0]
def numToDottedip(n):
"convert long int to ipv4/6"
return socket.inet_ntop(struct.pack('>L',n))

这个例子改编自我在这里发现的内容:

  • https://www.oreilly.com/library/view/python-cookbook/0596001673/ch10s06.html

您将不得不修改它

此外,如果你想了解更多关于套接字和结构模块的信息,这里有文档:

  • https://docs.python.org/3/library/socket.html
  • https://docs.python.org/3/library/struct.html

您不需要拆分文件,因为CSVreader对象一次只返回一行,而不是一次读取整个文件。当然,一旦你读过这些数字,你可能也想对它们做点什么,但由于你没有具体说明,我会告诉你的。

另外请注意,我还没有尝试过这些代码。这里值得以隐喻的形式重复:我试图教你钓鱼,而不仅仅是给你鱼。采纳这个建议并努力让它自己发挥作用最符合你的利益,因为这将是你真正成为程序员的第一步。

最新更新