web-dev-qa-db-fra.com

Caractère de nouvelle ligne CSV observé dans une erreur de champ non citée

le code suivant fonctionnait jusqu'à aujourd'hui, lorsque j'ai importé à partir d'une machine Windows et que cette erreur s'est produite:

Caractère de nouvelle ligne vu dans un champ non entre guillemets - devez-vous ouvrir le fichier en mode de nouvelle ligne universel?

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)
111
GrantU

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

file_read = csv.reader(self.file)

avec:

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

Ou bien, ouvrez un fichier avec universal newline mode et transmettez-le à csv.reader, comme suit:

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
173
alecxe

Je me rends compte que c’est un vieux post, mais j’ai rencontré le même problème et je ne vois pas la bonne réponse, alors je vais essayer.

Erreur Python:

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

Causé par une tentative de lecture de fichiers CSV Macintosh (formatés avant OS X). Ce sont des fichiers texte qui utilisent CR pour la fin de ligne. Si vous utilisez MS Office, veillez à sélectionner le format CSV en clair ou le format CSV (MS-DOS). N'utilisez pas de fichier CSV (Macintosh) as save-as. 

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

49
g.kovatchev

Pour Mac OS X, enregistrez votre fichier CSV au format "Windows Comma Separated (.csv)".

30
BoltzmannBrain

Si cela vous arrive sur mac (comme cela m’a été fait):

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

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

Essayez d’exécuter dos2unix sur vos fichiers importés Windows

5
rectummelancolique

C'est une erreur à laquelle j'ai fait face. 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.

2
Suraj

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
Resonance

Je sais que cela a été répondu pendant un certain temps, mais pas résoudre mon problème. J'utilise DictReader et StringIO pour ma lecture csv en raison de certaines 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. 

0
Dougyfresh

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

0
p699