Otwórz plik w trybie Universal-Newline za pomocą modułu CSV Django

86

Próbuję uzyskać dostęp do model.filefieldw Django, aby przeanalizować plik CSV w Pythonie za pomocą csvmodułu. Działa w systemie Windows, ale na Macu dał mi to:

Exception Type: Error

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

To jest kod:

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

mydata = csv.reader(myfile)
    for email,mobile,name,civilid in mydata:
        print email,mobile,name,civilid
mohd
źródło
co to za customerbulk.objects.all()[0].fileuprzecz. Czy to nazwa pliku w modelu?
SingleNegationElimination
fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles'), jeśli wykonam małe zapytanie, takie jak customerbulk.objects.get (pk = 1)
mohd
1
Dokładny powód użycia rU(jest związany z funkcją open () i nie jest specyficzny dla 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
W Pythonie> = 3 użyj newline=''zamiast mode='U'.
tricasse

Odpowiedzi:

150

W końcu znalazłem rozwiązanie:

mypath = customerbulk.objects.get(pk=1).fileup.path
o = open(mypath,'rU')
mydata = csv.reader(o)
mohd
źródło
2
Wierzę, że możesz to uprościć. Po otwarciu pliku szukanie początku wydaje się dziwne. Poniższe pomogły mi rozwiązać ten sam problem z eksportem arkusza kalkulacyjnego Excel do CSV przy użyciu ustawień domyślnych: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo
4
Tak, nie ma potrzeby szukania początku pliku zaraz po otwarciu. Bit >>> o = open (mypath, 'rU') z flagą 'rU' to ważna magia, która zadziałała w moim przypadku.
rd108
13
PEP278 wyjaśnił, co rUoznacza: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 za link do oryginalnego PEP, co wyjaśnia uzasadnienie.
Naymesh Mistry
W Pythonie> = 3 newlinezamiast tego użyj , domyślnym ustawieniem jest newline=Nonektóry jest podobny, newline=''z wyjątkiem tego, że tłumaczy również znaki nowej linii na \n. Nie jestem pewien, który z nich jest równoważnymode='U'
timdiels