Se ve un carácter de nueva línea CSV en un error de campo sin comillas

121

el siguiente código funcionó hasta hoy cuando importé desde una máquina con Windows y obtuve este error:

carácter de nueva línea visto en un campo sin comillas: ¿necesita abrir el archivo en modo universal de nueva línea?

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]

¿Cómo puedo solucionar este problema?

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)
GrantU
fuente
La respuesta de rectummelancolique a continuación es lo que resolvió mi problema similar. stackoverflow.com/a/17315726/3131666
kmantel

Respuestas:

181

Será bueno ver el archivo csv en sí, pero esto podría funcionar para usted, pruébelo, reemplace:

file_read = csv.reader(self.file)

con:

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

O abra un archivo con universal newline modey páselo a csv.reader, como:

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

O use splitlines(), así:

def read_file(self):
    with open(self.file, 'r') as f:
        data = [row for row in csv.reader(f.read().splitlines())]
    return data
Alecxe
fuente
Esto ahora da el mismo error, pero en línea comenzando upload.num_records = csvobject.get_row_count () ahora
GrantU
1
y cuando pruebo la versión de líneas divididas (que es muy genial gracias) obtengo coacción a Unicode: necesito cadena o búfer, se encontró
S3BotoStorageFile
4
¿Qué opción funcionó finalmente? Por cierto, que está leyendo el archivo dos veces: en get_row_count()y en get_column_count()- considere leer el archivo en __init__y recordar dataen self.data, a continuación, utilizarlo en otros métodos.
alecxe
+1 para splitlines () lo que evita jugar con diferentes opciones de formato en OSX. Espero que también funcione en otras plataformas ...
python1981
Gran respuesta. Sin embargo, usar - "dialect = csv.excel_tab" arruina la salida cuando se usa con csv.DictReader. Sin embargo
Murphy
52

Me doy cuenta de que esta es una publicación antigua, pero encontré el mismo problema y no veo la respuesta correcta, así que lo intentaré

Error de Python:

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

Se produce al intentar leer archivos CSV de Macintosh (con formato anterior a OS X). Estos son archivos de texto que usan CR para el final de la línea. Si usa MS Office, asegúrese de seleccionar el formato CSV simple o CSV (MS-DOS) . No utilice CSV (Macintosh) como tipo de guardar como.

Mi versión EOL preferida sería LF (Unix / Linux / Apple), pero no creo que MS Office ofrezca la opción de guardar en este formato.

g.kovatchev
fuente
4
MS DOS Comma Separated no funcionó para mí (mismo error), pero Windows Comma Separated.
tmthyjames
3
Si está en una Mac, esta es absolutamente la respuesta correcta.
HashHazard
Tengo el mismo problema en OS X. Tengo que crear un nuevo archivo CSV. El simple hecho de guardar el archivo actual como formato CSV simple o CSV (MS-DOS) no soluciona el problema.
Pyderman
1
En OS X, Windows csv separado por comas funcionó, MS DOS separado por comas no.
user2348114
31

Para Mac OS X, guarde su archivo CSV en formato "Separado por comas de Windows (.csv)".

Boltzmann Cerebro
fuente
1
gracias, ese era el ingrediente necesario, ya que estoy usando Mac con MS Office.
travelingbones
18

Si esto te sucede en mac (como me pasó a mí):

  1. Guarde el archivo como CSV (MS-DOS Comma-Separated)
  2. Ejecute el siguiente script

    with open(csv_filename, 'rU') as csvfile:
        csvreader = csv.reader(csvfile)
        for row in csvreader:
            print ', '.join(row)
Nimo
fuente
2
Acabas de sacudir mi mundo.
kta
5

Intente ejecutar dos2unixprimero en sus archivos importados de Windows

rectummelancolique
fuente
realmente no es una opción que necesito para permitir que el usuario cargue csv desde Windows y Mac sin ninguna modificación especial. La importación se guardó desde Excel (Windows) como CSV, por lo que tal vez haya algo adicional que deba hacerse en Python para leerlos
GrantU
@GrantU Te refieres a Mac OS X 10.0 o posterior, no a Mac OS 9 o anterior, ¿correcto? Entre 9 y 10, Mac OS cambió de \x0dfinales de línea (ProDOS) a finales de línea \x0a(UNIX).
Damian Yerrick
2

Este es un error al que me enfrenté. Había guardado el archivo .csv en MAC OSX.

Mientras guarda, guárdelo como "Valores separados por comas de Windows (.csv)" que resolvió el problema.

Suraj
fuente
1

Esto funcionó para mí en 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 
Resonancia
fuente
1

Sé que esto ha sido respondido durante bastante tiempo, pero no resolvió mi problema. Estoy usando DictReader y StringIO para mi lectura de csv debido a otras complicaciones. Pude resolver el problema de manera más simple reemplazando los delimitadores explícitamente:

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

Puede que no sea razonable para archivos CSV enormes, pero funcionó bien para mi caso de uso.

Dougyfresh
fuente
Que resolvió mi problema, gracias Mira! Aquí
AOF
0

Solución alternativa y rápida: me enfrenté al mismo error. Reabrí el archivo csv "extraño" en GNUMERIC en mi máquina lubuntu y exporté el archivo como archivo csv. Esto corrigió el problema.

p699
fuente