Buka file dalam mode baris baru universal menggunakan modul CSV Django

86

Saya mencoba mengakses a model.filefielddi Django untuk mengurai file CSV dengan Python menggunakan csvmodul. Ini berfungsi di Windows, tetapi di Mac itu memberi saya ini:

Exception Type: Error

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

Ini kodenya:

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

mydata = csv.reader(myfile)
    for email,mobile,name,civilid in mydata:
        print email,mobile,name,civilid
mohd
sumber
benda apa ini customerbulk.objects.all()[0].fileup. Apakah itu nama file pada model?
SingleNegationElimination
fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles') jika saya membuat kueri kecil seperti customerbulk.objects.get (pk = 1)
mohd
1
Alasan pasti penggunaan rU(Ini terkait dengan fungsi open () dan tidak spesifik 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
Dalam Python> = 3, menggunakan newline=''bukan mode='U'.
tricasse

Jawaban:

150

Saya akhirnya menemukan solusinya:

mypath = customerbulk.objects.get(pk=1).fileup.path
o = open(mypath,'rU')
mydata = csv.reader(o)
mohd
sumber
2
Saya yakin Anda bisa menyederhanakan ini. Tampaknya aneh untuk memulai setelah baru saja membuka file. Berikut ini membantu saya mengatasi masalah yang sama dari ekspor spreadsheet Excel ke CSV menggunakan default: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo
4
Ya, tidak perlu mencari ke awal file setelah dibuka. Bit >>> o = open (mypath, 'rU'), dengan flag 'rU' adalah keajaiban penting yang berhasil dalam kasus saya.
rd108
13
PEP278 menjelaskan apa rUsingkatan dari: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 untuk menautkan ke PEP asli yang menjelaskan alasannya.
Naymesh Mistry
Dalam Python> = 3, gunakan newlinesebagai gantinya, defaultnya newline=Noneadalah seperti newline=''kecuali itu juga menerjemahkan baris baru menjadi \n. Saya tidak yakin mana yang setara dengan inimode='U'
timdiels