Abra el archivo en modo universal-newline usando el módulo CSV Django

86

Estoy tratando de acceder a model.filefielden Django para analizar un archivo CSV en Python usando el csvmódulo. Está funcionando en Windows, pero en Mac me dio esto:

Exception Type: Error

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

Este es el código:

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

mydata = csv.reader(myfile)
    for email,mobile,name,civilid in mydata:
        print email,mobile,name,civilid
mohd
fuente
que es esta customerbulk.objects.all()[0].fileupcosa. ¿Es un nombre de archivo en un modelo?
SingleNegationElimination
fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles') si hago una pequeña consulta como customerbulk.objects.get (pk = 1)
mohd
1
La razón exacta de uso rU(está relacionada con la función open () y no es específica de 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
En Python> = 3, use en newline=''lugar de mode='U'.
tricasse

Respuestas:

150

Finalmente encontré la solución:

mypath = customerbulk.objects.get(pk=1).fileup.path
o = open(mypath,'rU')
mydata = csv.reader(o)
mohd
fuente
2
Creo que puedes simplificar esto. Parece extraño buscar el principio después de abrir el archivo. Lo siguiente me ayudó a superar el mismo problema de una exportación de hoja de cálculo de Excel a CSV usando los valores predeterminados: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo
4
Sí, no es necesario buscar el comienzo del archivo justo después de abrirlo. El >>> o = open (mypath, 'rU') bit, con la bandera 'rU' es la magia importante que funcionó en mi caso.
rd108
13
PEP278 explicó lo que 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 por vincularse al PEP original, lo que explica la justificación.
Naymesh Mistry
En Python> = 3, use newlineen su lugar, el valor predeterminado newline=Nonees como, newline=''excepto que también traduce las nuevas líneas a \n. No estoy seguro de cuál de estos es equivalente amode='U'
timdiels