Carattere di nuova riga CSV visualizzato in un errore di campo non quotato


121

il seguente codice ha funzionato fino ad oggi quando ho importato da una macchina Windows e ho ricevuto questo errore:

carattere di nuova riga visualizzato in un campo non quotato: è necessario aprire il file in modalità di nuova riga universale?

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]

Come posso risolvere questo 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)

La risposta di rectummelancolique di seguito è ciò che ha risolto il mio problema simile. stackoverflow.com/a/17315726/3131666
kmantel

Risposte:


181

Sarà bello vedere il file csv stesso, ma potrebbe funzionare per te, provalo, sostituisci:

file_read = csv.reader(self.file)

con:

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

Oppure apri un file con universal newline modee passalo a csv.reader, ad esempio:

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

Oppure usa splitlines(), in questo modo:

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

Questo ora restituisce lo stesso errore, ma in linea a partire da upload.num_records = csvobject.get_row_count () ora
GrantU

1
e quando provo la versione con linee divise (che è molto fredda grazie) ottengo la coercizione in Unicode: serve una stringa o un buffer, trovato
S3BotoStorageFile

4
Quale opzione alla fine ha funzionato? Btw, si sta leggendo il file due volte: nel get_row_count()e get_column_count()- considera la lettura del file in __init__e ricordare datain self.data, quindi utilizzarlo in altri metodi.
alecxe

+1 per le linee di divisione () che evita di scherzare con diverse opzioni di formattazione su OSX. Spero che funzioni anche su altre piattaforme ...
python1981

Bella risposta. L'uso di - "dialect = csv.excel_tab" tuttavia, rovina l'output quando viene utilizzato con csv.DictReader. Solo le opzioni "rU" funzionano magicamente però
Murphy

52

Mi rendo conto che questo è un vecchio post, ma ho riscontrato lo stesso problema e non vedo la risposta corretta, quindi proverò

Errore Python:

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

Causato dal tentativo di leggere file CSV Macintosh (pre formattati per OS X). Questi sono file di testo che usano CR per la fine della riga. Se utilizzi MS Office, assicurati di selezionare il formato CSV normale o CSV (MS-DOS) . Non utilizzare CSV (Macintosh) come tipo di salvataggio con nome.

La mia versione EOL preferita sarebbe LF (Unix / Linux / Apple), ma non credo che MS Office offra l'opzione per salvare in questo formato.


4
MS DOS Comma Separated non ha funzionato per me (stesso errore), ma Windows Comma Separated.
tmthyjames

3
Se utilizzi un Mac, questa è assolutamente la risposta corretta.
HashHazard

Ottengo lo stesso problema su OS X. Mi ritrovo a dover creare un nuovo file CSV. Il semplice salvataggio della corrente come semplice formato CSV o CSV (MS-DOS) non risolve il problema.
Pyderman

1
Su OS X, Windows Comma Separated CSV funzionava, MS DOS Comma Separated no.
user2348114

31

Per Mac OS X, salva il file CSV in formato "Windows Comma Separated (.csv)".


1
grazie, quello era l'ingrediente necessario, dato che sto usando Mac con MS Office.
travellingbones

18

Se questo accade a te su mac (come è successo a me):

  1. Salva il file come CSV (MS-DOS Comma-Separated)
  2. Esegui il seguente script

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

2
Hai appena scosso il mio mondo.
kta

5

Prova prima a eseguire dos2unixsui file importati da Windows


non è davvero un'opzione di cui ho bisogno per consentire all'utente di caricare csv da Windows e Mac senza alcuna modifica speciale. L'importazione è stata salvata da Excel (Windows) come CSV, quindi forse c'è qualcosa in più che deve essere fatto in Python per leggerli?
GrantU

@GrantU Ti riferisci a Mac OS X 10.0 o successivo, non a Mac OS 9 o precedente, corretto? Tra 9 e 10, Mac OS è passato dalle \x0dterminazioni di riga (ProDOS) alle terminazioni di riga \x0a(UNIX).
Damian Yerrick

2

Questo è un errore che ho dovuto affrontare. Avevo salvato il file .csv in MAC OSX.

Durante il salvataggio, salvalo come "Windows Comma Separated Values ​​(.csv)" che ha risolto il problema.


1

Questo ha funzionato per me su 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

So che è stato risposto per un bel po 'di tempo ma non risolve il mio problema. Sto usando DictReader e StringIO per la mia lettura CSV a causa di altre complicazioni. Sono stato in grado di risolvere il problema più semplicemente sostituendo esplicitamente i delimitatori:

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

Potrebbe non essere ragionevole per enormi file CSV, ma ha funzionato bene per il mio caso d'uso.


Che ha risolto il mio problema, grazie Guardate! Qui
AOF

0

Soluzione alternativa e veloce: ho riscontrato lo stesso errore. Ho riaperto il file csv "strano" in GNUMERIC sulla mia macchina lubuntu e ho esportato il file come file csv. Questo ha risolto il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.