Ouvrez le fichier en mode nouvelle ligne universelle à l'aide du module CSV Django

86

J'essaie d'accéder à un model.filefieldDjango pour analyser un fichier CSV en Python à l'aide du csvmodule. Cela fonctionne sous Windows, mais sur Mac, cela m'a donné ceci:

Exception Type: Error

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

Voici le code:

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

mydata = csv.reader(myfile)
    for email,mobile,name,civilid in mydata:
        print email,mobile,name,civilid
mohd
la source
quelle est cette customerbulk.objects.all()[0].fileupchose. S'agit-il d'un nom de fichier sur un modèle?
SingleNegationElimination
fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles') si je fais une petite requête comme customerbulk.objects.get (pk = 1)
mohd
1
La raison exacte de l'utilisation rU(elle est liée à la fonction open () et n'est pas spécifique à 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
En Python> = 3, utilisez à la newline=''place de mode='U'.
tricasse

Réponses:

150

J'ai enfin trouvé la solution:

mypath = customerbulk.objects.get(pk=1).fileup.path
o = open(mypath,'rU')
mydata = csv.reader(o)
mohd
la source
2
Je pense que vous pouvez simplifier cela. Il semble étrange de chercher au début après avoir simplement ouvert le fichier. Ce qui suit m'a aidé à surmonter le même problème lors de l'exportation d'une feuille de calcul Excel vers CSV en utilisant les valeurs par défaut: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo
4
Oui, il n'est pas nécessaire de chercher au début du fichier juste après l'ouverture. Le bit >>> o = open (mypath, 'rU'), avec le drapeau 'rU' est la magie importante qui a fonctionné dans mon cas.
rd108
13
PEP278 a expliqué ce que rUsignifie: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 pour créer un lien vers le PEP original, ce qui explique la justification.
Naymesh Mistry
En Python> = 3, utilisez à la newlineplace, la valeur par défaut est newline=Nonece qui est similaire newline=''sauf qu'il traduit également les retours à la ligne en \n. Je ne sais pas lequel de ces éléments équivaut àmode='U'
timdiels