it-swarm.com.de

CSV-Zeilenumbruchzeichen in nicht angegebenem Feldfehler

der folgende Code funktionierte bis heute, als ich von einem Windows-Computer importiert wurde und diesen Fehler erhielt:

neues Zeilenzeichen in nicht angegebenem Feld - müssen Sie die Datei im Universal-Newline-Modus öffnen?

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]

Wie kann ich dieses Problem beheben?

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

Es ist gut, die CSV-Datei selbst zu sehen, aber das könnte für Sie funktionieren, probieren Sie es aus, ersetzen Sie:

file_read = csv.reader(self.file)

mit:

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

Oder öffnen Sie eine Datei mit universal newline mode und übergeben Sie sie an csv.reader, z.

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

Oder verwenden Sie splitlines() wie folgt:

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

Ich weiß, dass dies ein alter Beitrag ist, aber ich bin auf das gleiche Problem gestoßen und sehe nicht die richtige Antwort, also werde ich es versuchen

Python-Fehler:

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

Wird durch den Versuch verursacht, CSV-Dateien im Macintosh-Format (vor OS X formatiert) zu lesen. Dies sind Textdateien, die CR für das Zeilenende verwenden. Wenn Sie MS Office verwenden, stellen Sie sicher, dass Sie entweder das einfache Format CSV oder CSV (MS-DOS) auswählen. Verwenden Sie CSV (Macintosh) nicht als Dateityp. 

Meine bevorzugte EOL-Version wäre LF (Unix/Linux/Apple), aber ich glaube nicht, dass MS Office die Option zum Speichern in diesem Format bietet.

49
g.kovatchev

Speichern Sie Ihre CSV-Datei unter Mac OS X im Format "Windows Comma Separated (.csv)".

30
BoltzmannBrain

Wenn Ihnen dies passiert auf Mac (wie es mir passiert ist):

  1. Speichern Sie die Datei als CSV (MS-DOS Comma-Separated).
  2. Führen Sie das folgende Skript aus

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

Versuchen Sie zuerst, dos2unix für Ihre mit Windows importierten Dateien auszuführen

5

Dies ist ein Fehler, dem ich begegnet bin. Ich hatte die CSV-Datei in MAC OSX gespeichert.

Speichern Sie es beim Speichern als "Windows-kommagetrennte Werte (.csv)", wodurch das Problem behoben wurde.

2
Suraj

Dies funktionierte für mich unter 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

Ich weiß, dass dies seit einiger Zeit beantwortet wurde, aber mein Problem nicht löst. Ich verwende DictReader und StringIO für mein CSV-Lesen aufgrund einiger anderer Komplikationen. Ich konnte das Problem einfacher lösen, indem die Begrenzer explizit ersetzt wurden:

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

Für riesige CSV-Dateien möglicherweise nicht sinnvoll, aber für meinen Anwendungsfall gut geeignet. 

0
Dougyfresh

Alternative und schnelle Lösung: Ich hatte den gleichen Fehler. Ich habe die "seltsame" csv-Datei in GNUMERIC auf meiner Lubuntu-Maschine wieder geöffnet und die Datei als csv-Datei exportiert. Dies hat das Problem behoben. 

0
p699