Скрипт для большого файла CSV для преобразования адресов IPv6 в число (или строку) - PullRequest
0 голосов
/ 03 ноября 2018

Итак, у меня большой CSV-файл, более 1 ГБ. В ipv4 и ipv6 есть столбец с IP-адресами. Я хочу преобразовать адреса ipv6 в числа, но в libre calc слишком много строк. Поэтому мне интересно, можно ли использовать python в терминале для преобразования всех адресов ipv6.

Кроме того, я мог бы разбить файл на более мелкие части, затем использовать libre calc, но та же проблема - я бы тоже не знал, как это написать.

EDIT:

Я не против, хотя это может быть сложнее. Также не уверен, как это должно быть отформатировано, но я надеюсь, что люди поймут идею ... Итак, у меня есть одна таблица с адресами 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, а затем отсортировать их по соответствующим диапазонам.

1 Ответ

0 голосов
/ 03 ноября 2018

Да, это то, что вы можете сделать в 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

Оригинал, на котором основан этот пример, и дополнительная информация о встроенных возможностях CSV в python:

Возможно, вам потребуется внести коррективы в зависимости от точного форматирования вашего конкретного файла 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))

Этот пример адаптирован из того, что я нашел здесь:

Вам придется изменить его

Также, если вы хотите узнать больше о модулях сокетов и структур, вот документация:

Вам не нужно разбивать файл на части, поскольку объект CSV reader будет возвращать только одну строку за раз, а не считывать весь файл сразу. Конечно, вы также, вероятно, захотите что-то сделать с этими числами, как только прочитаете их, но, поскольку вы не указали это, я вам это выясню.

Также обратите внимание, что я не пробовал ни один из этого кода. Стоит повторить здесь в форме метафоры: я пытаюсь научить вас ловить рыбу, а не просто давать вам рыбу. В ваших же интересах воспользоваться этим советом и попытаться заставить его работать самостоятельно, поскольку это будет вашим первым шагом к тому, чтобы стать программистом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...