Abra o arquivo no modo universal-newline usando o módulo CSV Django


86

Estou tentando acessar um model.filefieldno Django para analisar um arquivo CSV em Python usando o csvmódulo. Está funcionando no Windows, mas no Mac me deu o seguinte:

Exception Type: Error

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

Este é o código:

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

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

o que é essa customerbulk.objects.all()[0].fileupcoisa. É um nome de arquivo em um modelo?
SingleNegationElimination

fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles') se eu fizer uma pequena consulta como customerbulk.objects.get (pk = 1)
mohd

1
O motivo exato de usar rU(está relacionado à função open () e não é específico do 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

Em Python> = 3, use em newline=''vez de mode='U'.
tricasse

Respostas:


150

Finalmente encontrei a solução:

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

2
Eu acredito que você pode simplificar isso. Parece estranho buscar o início depois de apenas abrir o arquivo. O seguinte me ajudou a superar o mesmo problema de uma exportação de planilha do Excel para CSV usando os padrões: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo

4
Sim, não há necessidade de buscar o início do arquivo logo após a abertura. O >>> o = open (mypath, 'rU') bit, com o sinalizador 'rU', é a mágica importante que funcionou no meu caso.
rd108

13
O PEP278 explicou o que rUsignifica: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 por vincular ao PEP original, o que explica a razão.
Naymesh Mistry de

Em Python> = 3, use newlineem vez disso, o padrão é newline=Noneque é como newline=''a não ser que se traduz também as novas linhas para \n. Não tenho certeza de qual deles é equivalente amode='U'
timdiels
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.