Apri il file in modalità newline universale utilizzando il modulo Django CSV


86

Sto cercando di accedere a model.filefieldin Django per analizzare un file CSV in Python utilizzando il csvmodulo. Funziona su Windows, ma su Mac mi ha dato questo:

Exception Type: Error

Exception Value: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

Questo è il codice:

myfile = customerbulk.objects.all()[0].fileup

mydata = csv.reader(myfile)
    for email,mobile,name,civilid in mydata:
        print email,mobile,name,civilid

cos'è questa customerbulk.objects.all()[0].fileupcosa. È un nome di file su un modello?
SingleNegationElimination

fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles') se eseguo una piccola query come customerbulk.objects.get (pk = 1)
mohd

1
Il motivo esatto dell'utilizzo rU(è correlato alla funzione open () e non è specifico per csv.): In addition to the standard fopen() values mode may be 'U' or 'rU'. Python is usually built with universal newlines support; supplying 'U' opens the file as a text file, but lines may be terminated by any of the following: the Unix end-of-line convention '\n', the Macintosh convention '\r', or the Windows convention '\r\n'. Docs.python.org/2/library/functions.html#open
zengr

In Python> = 3, usa newline=''invece di mode='U'.
tricasse

Risposte:


150

Finalmente ho trovato la soluzione:

mypath = customerbulk.objects.get(pk=1).fileup.path
o = open(mypath,'rU')
mydata = csv.reader(o)

2
Credo che tu possa semplificarlo. Sembra strano cercare l'inizio dopo aver appena aperto il file. Quanto segue mi ha aiutato a superare lo stesso problema dell'esportazione di un foglio di calcolo Excel in CSV utilizzando i valori predefiniti: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo

4
Sì, non è necessario cercare l'inizio del file subito dopo l'apertura. Il bit >>> o = open (mypath, 'rU'), con il flag 'rU' è l'importante magia che ha funzionato nel mio caso.
rd108

13
PEP278 ha spiegato cosa rUsignifica:In a Python with universal newline support open() the mode parameter can also be "U", meaning "open for input as a text file with universal newline interpretation". Mode "rU" is also allowed, for symmetry with "rb".
Xiao

@Xiao +1 per il collegamento al PEP originale che spiega la logica.
Naymesh Mistry

In Python> = 3, usa newlineinvece, il valore predefinito newline=Noneè simile newline=''tranne che traduce anche le nuove righe in \n. Non sono sicuro quale di questi sia equivalente amode='U'
timdiels
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.