Öffnen Sie die Datei im Universal-Newline-Modus mit dem CSV-Django-Modul


86

Ich versuche, auf eine model.filefieldin Django zuzugreifen , um eine CSV- Datei in Python mit dem csvModul zu analysieren . Es funktioniert unter Windows, aber auf dem Mac gab es mir Folgendes:

Exception Type: Error

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

Dies ist der Code:

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

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

Was ist das für ein customerbulk.objects.all()[0].fileupDing? Ist es ein Dateiname auf einem Modell?
SingleNegationElimination

fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles'), wenn ich eine kleine Abfrage wie customerbulk.objects.get (pk = 1)
mohd mache

1
Der genaue Grund für die Verwendung rU(Sie hängt mit der Funktion open () zusammen und ist nicht csv-spezifisch.): 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

Verwenden Sie in Python> = 3 newline=''anstelle von mode='U'.
Tricasse

Antworten:


150

Ich habe endlich die Lösung gefunden:

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

2
Ich glaube, Sie können dies vereinfachen. Es scheint seltsam, nach dem Öffnen der Datei an den Anfang zu gehen. Das Folgende hat mir geholfen, das gleiche Problem bei einem Excel-Tabellenexport nach CSV mit den Standardeinstellungen zu beheben: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo

4
Ja, Sie müssen nicht gleich nach dem Öffnen nach dem Beginn der Datei suchen. Das >>> o = open-Bit (mypath, 'rU') mit dem Flag 'rU' ist die wichtige Magie, die in meinem Fall funktioniert hat.
Rd108

13
PEP278 erklärte, wofür rUsteht: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 für die Verknüpfung mit dem ursprünglichen PEP, in dem die Gründe erläutert werden.
Naymesh Mistry

Verwenden Sie in Python> = 3 newlinestattdessen die Standardeinstellung, mit newline=Noneder newline=''Ausnahme, dass auch die Zeilenumbrüche in übersetzt werden \n. Ich bin mir nicht sicher, welches davon gleichbedeutend ist mitmode='U'
timdiels
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.