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

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)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.