Domanda

Ho un file in formato CSV in cui il delimitatore è il separatore ^_ modulo ASCII e la linea di terminazione è il separatore ^^ record di ASCII (ovviamente, in quanto questi sono i caratteri non stampabili, ho appena usato uno dei modi standard di scrittura qui). Ho scritto un sacco di codice che legge e scrive i file CSV, quindi il mio problema non è con il CSV di Python modulo di per sé. Il problema è che il modulo csv non supporta la lettura (ma supporta scrittura) terminatori di linea diversi da un ritorno a capo o avanzamento riga, almeno a partire da Python 2.6 dove appena provato. La documentazione dice che questo è perché è difficile codificato, che prendo a dire, è fatto nel codice C che è alla base del modulo, dal momento che non ho visto nulla nel file csv.py che ho potuto cambiare.

Qualcuno sa un modo per aggirare questa limitazione (patch, un altro modulo CSV, ecc)? Ho davvero bisogno di leggere in un file in cui non posso utilizzare ritorni a capo o di nuove linee come il terminatore di linea, perché appariranno quei personaggi in alcuni dei campi, e vorrei evitare di scrivere il mio codice lettore personalizzato, se possibile, anche se questo sarebbe piuttosto semplice per soddisfare le mie esigenze.

È stato utile?

Soluzione

Perché non fornire un iterabile personalizzato alla funzione csv.reader? Ecco un'implementazione ingenuo, che legge l'intero contenuto del file CSV in memoria in una sola volta (che può o non può essere auspicabile, a seconda delle dimensioni del file):

def records(path):
    with open(path) as f:
        contents = f.read()
        return (record for record in contents.split('^^'))

csv.reader(records('input.csv'))

Credo che dovrebbe funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top