123 votes

Erreur de caractère de nouvelle ligne CSV vu dans un champ non cité

Le code suivant a fonctionné jusqu'à aujourd'hui où j'ai importé à partir d'une machine Windows et j'ai obtenu cette erreur :

le caractère de nouvelle ligne est vu dans un champ non cité - devez-vous ouvrir le fichier en mode universel de 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)

2voto

Suraj Points 29

Voici une erreur à laquelle j'ai été confronté. J'ai enregistré le fichier .csv dans MAC OSX.

Lors de l'enregistrement, sauvegardez-le en tant que "Windows Comma Separated Values (.csv)", ce qui a résolu le problème.

1voto

Resonance Points 578

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

1voto

Dougyfresh Points 56

Je sais que cette question a été répondue depuis un certain temps mais ne résout pas mon problème. J'utilise DictReader et StringIO pour la lecture de mon csv en raison de quelques autres complications. J'ai pu résoudre le problème plus simplement en remplaçant les délimiteurs de manière explicite :

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')

Ce n'est peut-être pas raisonnable pour d'énormes fichiers CSV, mais cela a bien fonctionné pour mon cas d'utilisation.

0voto

p699 Points 125

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X