Caractère de nouvelle ligne CSV vu dans une erreur de champ sans guillemets


121

le code suivant a fonctionné jusqu'à aujourd'hui, lorsque j'ai importé à partir d'une machine Windows et que j'ai obtenu cette erreur:

caractère de nouvelle ligne vu dans le champ sans guillemets - devez-vous ouvrir le fichier en mode universel-nouvelle ligne?

import csv

class CSV:


    def __init__(self, file=None):
        self.file = file

    def read_file(self):
        data = []
        file_read = csv.reader(self.file)
        for row in file_read:
            data.append(row)
        return data

    def get_row_count(self):
        return len(self.read_file())

    def get_column_count(self):
        new_data = self.read_file()
        return len(new_data[0])

    def get_data(self, rows=1):
        data = self.read_file()

        return data[:rows]

Comment puis-je résoudre ce problème?

def upload_configurator(request, id=None):
    """
    A view that allows the user to configurator the uploaded CSV.
    """
    upload = Upload.objects.get(id=id)
    csvobject = CSV(upload.filepath)

    upload.num_records = csvobject.get_row_count()
    upload.num_columns = csvobject.get_column_count()
    upload.save()

    form = ConfiguratorForm()

    row_count = csvobject.get_row_count()
    colum_count = csvobject.get_column_count()
    first_row = csvobject.get_data(rows=1)
    first_two_rows = csvobject.get_data(rows=5)

La réponse de rectummelancolique ci-dessous est ce qui a résolu mon problème similaire. stackoverflow.com/a/17315726/3131666
kmantel

Réponses:


181

Ce sera bien de voir le fichier csv lui-même, mais cela pourrait fonctionner pour vous, essayez-le, remplacez:

file_read = csv.reader(self.file)

avec:

file_read = csv.reader(self.file, dialect=csv.excel_tab)

Ou ouvrez un fichier avec universal newline modeet transmettez-le à csv.reader, comme:

reader = csv.reader(open(self.file, 'rU'), dialect=csv.excel_tab)

Ou, utilisez splitlines(), comme ceci:

def read_file(self):
    with open(self.file, 'r') as f:
        data = [row for row in csv.reader(f.read().splitlines())]
    return data

Cela donne maintenant la même erreur, mais en ligne à partir de upload.num_records = csvobject.get_row_count () maintenant
GrantU

1
et quand j'essaye la version de lignes divisées (qui est très cool merci), je suis contraint à Unicode: besoin de chaîne ou de tampon, S3BotoStorageFile trouvé
GrantU

4
Quelle option a finalement fonctionné? Btw, vous lisez le fichier deux fois: in get_row_count()et in get_column_count()- envisagez de lire le fichier __init__et de vous dataen souvenir self.data, puis utilisez-le dans d'autres méthodes.
alecxe le

+1 pour les lignes fractionnées (), ce qui évite de jouer avec différentes options de formatage sous OSX. J'espère que cela fonctionne aussi sur d'autres plates-formes ...
python1981

Très bonne réponse. Cependant, l'utilisation de - "dialect = csv.excel_tab" visse la sortie lorsqu'elle est utilisée avec csv.DictReader. Cependant, seules les options `` rU '' fonctionnent comme par magie
Murphy

52

Je me rends compte qu'il s'agit d'un ancien message, mais j'ai rencontré le même problème et je ne vois pas la bonne réponse, je vais donc essayer

Erreur Python:

_csv.Error: new-line character seen in unquoted field

Causé par une tentative de lecture de fichiers CSV Macintosh (pré-formatés OS X). Ce sont des fichiers texte qui utilisent CR pour la fin de la ligne. Si vous utilisez MS Office, assurez-vous de sélectionner le format CSV ordinaire ou CSV (MS-DOS) . N'utilisez pas CSV (Macintosh) comme type d'enregistrement.

Ma version EOL préférée serait LF (Unix / Linux / Apple), mais je ne pense pas que MS Office offre la possibilité d'enregistrer dans ce format.


4
MS DOS Comma Separated ne fonctionnait pas pour moi (même erreur), mais Windows Comma Separated.
tmthyjames

3
Si vous êtes sur un Mac, c'est absolument la bonne réponse.
HashHazard

J'ai le même problème sous OS X. Je dois créer un nouveau fichier CSV. Le simple fait d'enregistrer le courant au format CSV ou CSV (MS-DOS) ne résout pas le problème.
Pyderman

1
Sur OS X, Windows Comma Separated csv fonctionnait, MS DOS Comma Separated ne fonctionnait pas.
user2348114

31

Sous Mac OS X, enregistrez votre fichier CSV au format «Windows Comma Separated (.csv)».


1
merci, c'était l'ingrédient nécessaire, car j'utilise Mac avec MS Office.
travellingbones

18

Si cela vous arrive sur mac (comme pour moi):

  1. Enregistrez le fichier sous CSV (MS-DOS Comma-Separated)
  2. Exécutez le script suivant

    with open(csv_filename, 'rU') as csvfile:
        csvreader = csv.reader(csvfile)
        for row in csvreader:
            print ', '.join(row)

2
Vous venez de secouer mon monde.
kta

5

Essayez d'abord d'exécuter dos2unixsur vos fichiers importés Windows


pas vraiment une option dont j'ai besoin pour permettre à l'utilisateur de télécharger des fichiers csv à partir de Windows et de Mac sans aucune modification particulière. L'importation a été enregistrée à partir d'Excel (Windows) au format CSV, alors peut-être qu'il y a quelque chose de plus à faire en Python pour les lire?
GrantU

@GrantU Vous parlez de Mac OS X 10.0 ou version ultérieure, et non de Mac OS 9 ou version antérieure, n'est-ce pas? Entre 9 et 10, Mac OS est passé des \x0dfins de ligne (ProDOS) aux fins de ligne \x0a(UNIX).
Damian Yerrick

2

C'est une erreur que j'ai rencontrée. J'avais enregistré le fichier .csv sous MAC OSX.

Lors de l'enregistrement, enregistrez-le sous «Valeurs séparées par des virgules Windows (.csv)», ce qui a résolu le problème.


1

Cela a fonctionné pour moi sur OSX.

# allow variable to opened as files
from io import StringIO

# library to map other strange (accented) characters back into UTF-8
from unidecode import unidecode

# cleanse input file with Windows formating to plain UTF-8 string
with open(filename, 'rb') as fID:
    uncleansedBytes = fID.read()
    # decode the file using the correct encoding scheme
    # (probably this old windows one) 
    uncleansedText = uncleansedBytes.decode('Windows-1252')

    # replace carriage-returns with new-lines
    cleansedText = uncleansedText.replace('\r', '\n')

    # map any other non UTF-8 characters into UTF-8
    asciiText = unidecode(cleansedText)

# read each line of the csv file and store as an array of dicts, 
# use first line as field names for each dict. 
reader = csv.DictReader(StringIO(cleansedText))
for line_entry in reader:
    # do something with your read data 

1

Je sais que cela a été répondu depuis un certain temps mais pas résoudre mon problème. J'utilise DictReader et StringIO pour ma lecture csv en raison d'autres complications. J'ai pu résoudre le problème plus simplement en remplaçant explicitement les délimiteurs:

with urllib.request.urlopen(q) as response:
    raw_data = response.read()
    encoding = response.info().get_content_charset('utf8') 
    data = raw_data.decode(encoding)
    if '\r\n' not in data:
        # proably a windows delimited thing...try to update it
        data = data.replace('\r', '\r\n')

Peut-être pas raisonnable pour d'énormes fichiers CSV, mais a bien fonctionné pour mon cas d'utilisation.


Cela a résolu mon problème, Merci Regarde! Ici
aof

0

Solution alternative et rapide: j'ai fait face à la même erreur. J'ai rouvert le fichier csv "wierd" dans GNUMERIC sur ma machine lubuntu et exporté le fichier en tant que fichier csv. Cela a corrigé le problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.