Откройте файл в режиме универсального перевода строки с помощью модуля 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
mohd
источник
что это за 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 04
В Python> = 3 используйте newline=''вместо mode='U'.
tricasse

Ответы:

150

Я наконец нашел решение:

mypath = customerbulk.objects.get(pk=1).fileup.path
o = open(mypath,'rU')
mydata = csv.reader(o)
mohd
источник
2
Я считаю, что вы можете это упростить. Кажется странным искать начало после открытия файла. Следующее помогло мне преодолеть ту же проблему при экспорте электронной таблицы Excel в CSV с использованием значений по умолчанию: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo
4
Да, нет необходимости искать начало файла сразу после открытия. Бит >>> o = open (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
@Xiao +1 за ссылку на исходный PEP, который объясняет причину.
Naymesh Mistry
В Python> = 3 используйте newlineвместо этого значение по умолчанию, newline=Noneкоторое похоже, newline=''за исключением того, что оно также переводит символы новой строки в \n. Я не уверен, что из этого эквивалентноmode='U'
Timdiels