Script para arquivo CSV grande para converter endereços IPv6 em número (ou string)

1

Então eu tenho um grande arquivo csv, mais de 1GB. Há uma coluna com endereços IP em ipv4 e ipv6. Eu quero converter os endereços ipv6 em números, mas existem muitas linhas para libre calc. Então, eu estou querendo saber se é possível usar python no terminal para converter todos os endereços IPv6.

Além disso, eu poderia dividir o arquivo em partes menores, então usar o libre calc, mas o mesmo problema - eu não saberia como fazer o script.

EDITAR:

Eu não me importo, pode ficar mais complicado. Também não sei como isso deve ser formatado, mas espero que as pessoas tenham a idéia ... Então eu tenho uma tabela com endereços IPv6 como estes exemplos:

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

Existem várias regras diferentes que governam a formatação - muito difíceis para mim. Ouvi dizer que python tem uma função que irá retornar especificamente a conversão, mas não tenho certeza sobre o resto (como obter os valores retornados de volta para o csv corretamente, com formatação ininterrupta, etc.). Enfim, aqui está uma linha da outra mesa:

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

Portanto, a parte que preciso corresponder é os dois primeiros números (as primeiras duas colunas), onde há vários intervalos de

"0","340282366920938463463374607431768211455"

Então, eu queria pegar os endereços IPv6, convertê-los em números IP e, em seguida, classificá-los em seus respectivos intervalos.

    
por peterh 03.11.2018 / 16:59

1 resposta

2

Sim, isso é algo que você pode fazer no Python. Demonstrarei com alguns pequenos trechos e links para a documentação que ficará aquém de uma solução completa em favor de capacitá-lo com os recursos de que você precisa para juntar as peças.

Primeiro, se você quiser carregar um arquivo CSV linha por linha e escrever para um segundo, é assim que você faria:

>>> 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

O original no qual este exemplo foi baseado e informações adicionais sobre os recursos CSV integrados do python podem ser encontrados aqui:

Você provavelmente precisará fazer ajustes dependendo da formatação exata do seu arquivo CSV específico. Agora, para converter endereços IP em números, você pode fazer algo como o seguinte:

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))

Este exemplo foi adaptado do que encontrei aqui:

Você terá que modificá-lo

Além disso, se você quiser saber mais sobre os módulos socket e struct, veja a documentação:

Não é necessário dividir o arquivo porque o objeto% CS_de% do CSV retornará apenas uma linha por vez, em vez de ler o arquivo inteiro de uma só vez. Claro, você provavelmente também quer fazer alguma coisa com esses números assim que os tiver lido, mas, como você não especificou, vou descobrir isso para você.

Observe também que não tentei nada deste código. Vale a pena repetir aqui na forma de uma metáfora: estou tentando ensiná-lo a pescar em vez de apenas dar-lhe peixe. É de seu interesse tomar este conselho e lutar para que ele funcione sozinho, já que seria o primeiro passo para ser um programador.

    
por 03.11.2018 / 17:55