Відкрийте файл у режимі універсальної нової лінії за допомогою модуля CSV Django


86

Я намагаюся отримати доступ до model.filefieldDjango для синтаксичного аналізу CSV- файлу в Python за допомогою csvмодуля. Це працює на Windows, але на Mac мені це дало:

Exception Type: Error

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

Це код:

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

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

що це за customerbulk.objects.all()[0].fileupріч. Це назва файлу на моделі?
SingleNegationElimination

fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles'), якщо я роблю невеликий запит, такий як customerbulk.objects.get (pk = 1)
mohd

1
Точна причина використання rU(Це пов’язано з функцією open () і не є специфічним для 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

У Python> = 3, використовуйте newline=''замість mode='U'.
tricasse

Відповіді:


150

Нарешті я знайшов рішення:

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

2
Я вірю, що ви можете спростити це. Здається дивним намагатись розпочати роботу лише після відкриття файлу. Наступне допомогло мені подолати ту саму проблему, пов’язану з експортом електронної таблиці Excel у CSV, використовуючи значення за замовчуванням: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo

4
Так, немає необхідності шукати початок файлу відразу після відкриття. Біт >>> o = відкритий (mypath, 'rU'), із позначкою 'rU' - це важлива магія, яка спрацювала у моєму випадку.
rd108

13
PEP278 пояснив, що rUозначає: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 +1 за посилання на оригінальний PEP, що пояснює обгрунтування.
Наймеш Місті

У Python> = 3, використовуйте newlineзамість цього, за замовчуванням newline=Noneвиглядає як, newline=''за винятком того, що він також перекладає нові рядки в \n. Я не впевнений, що з них еквівалентноmode='U'
timdiels
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.