CSV-Zeilenumbruchzeichen in nicht zitiertem Feldfehler

121

Der folgende Code funktionierte bis heute, als ich von einem Windows-Computer importierte und diesen Fehler bekam:

Zeilenumbruchzeichen im nicht zitierten Feld - Müssen Sie die Datei im Universal-Zeilenumbruchmodus ö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)
GrantU
quelle
Die Antwort von rectummelancolique unten hat mein ähnliches Problem gelöst. stackoverflow.com/a/17315726/3131666
kmantel

Antworten:

181

Es ist gut, die CSV-Datei selbst zu sehen, aber dies könnte für Sie funktionieren. Probieren Sie es aus und 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 modeund übergeben Sie sie an csv.reader:

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
Alecxe
quelle
Dies gibt jetzt den gleichen Fehler, aber online ab Upload.num_records = csvobject.get_row_count () jetzt
GrantU
1
und wenn ich die Split-Line-Version ausprobiere (was sehr cool ist, danke), erzwinge ich Unicode: brauche String oder Puffer, S3BotoStorageFile gefunden
GrantU
4
Welche Option hat schließlich funktioniert? Btw, lesen Sie die Datei zweimal: in get_row_count()und in get_column_count()- zu prüfen , in die Datei zu lesen __init__und erinnert datain self.data, dann ist es in anderen Methoden.
Alecxe
+1 für splitlines (), wodurch vermieden wird, dass unter OSX mit verschiedenen Formatierungsoptionen herumgespielt wird. Hoffe, es funktioniert auch auf anderen Plattformen ...
Python1981
Gute Antwort. Wenn Sie jedoch "dialect = csv.excel_tab" verwenden, wird die Ausgabe bei Verwendung mit csv.DictReader durcheinander gebracht. Nur die 'rU'-Optionen funktionieren magisch
Murphy
52

Mir ist klar, dass dies ein alter Beitrag ist, aber ich bin auf dasselbe 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

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

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.

g.kovatchev
quelle
4
MS DOS Comma Separated hat bei mir nicht funktioniert (gleicher Fehler), aber Windows Comma Separated.
tmthyjames
3
Wenn Sie auf einem Mac arbeiten, ist dies absolut die richtige Antwort.
HashHazard
Unter OS X tritt das gleiche Problem auf. Ich muss eine neue CSV-Datei erstellen. Das Problem wird nicht behoben, indem der Strom einfach als einfaches CSV-Format oder CSV (MS-DOS) gespeichert wird.
Pyderman
1
Unter OS X funktionierte Windows Comma Separated CSV, MS DOS Comma Separated nicht.
user2348114
31

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

BoltzmannBrain
quelle
1
Danke, das war die benötigte Zutat, da ich Mac mit MS Office benutze.
Travellingbones
18

Wenn dir das auf dem Mac passiert (wie mir):

  1. Speichern Sie die Datei unter 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)
Nimo
quelle
2
Du hast gerade meine Welt erschüttert.
kta
5

Versuchen dos2unixSie zuerst, unter Windows importierte Dateien auszuführen

rectummelancolique
quelle
Nein, wirklich eine Option, die ich brauche, um dem Benutzer das Hochladen von CSV von Windows und Mac ohne besondere Änderungen zu ermöglichen. Der Import wurde aus Excel (Windows) als CSV gespeichert. Vielleicht muss in Python noch etwas getan werden, um diese zu lesen?
GrantU
@GrantU Sie beziehen sich auf Mac OS X 10.0 oder höher, nicht auf Mac OS 9 oder früher, richtig? Zwischen 9 und 10 wechselte Mac OS von \x0d(ProDOS) Zeilenenden zu \x0a(UNIX) Zeilenenden.
Damian Yerrick
2

Dies ist ein Fehler, mit dem ich konfrontiert war. Ich hatte eine CSV-Datei in MAC OSX gespeichert.

Speichern Sie es beim Speichern als "Windows Comma Separated Values ​​(.csv)", wodurch das Problem behoben wurde.

Suraj
quelle
1

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 
Resonanz
quelle
1

Ich weiß, dass dies seit einiger Zeit beantwortet wurde, aber mein Problem nicht gelöst hat. Aufgrund einiger anderer Komplikationen verwende ich DictReader und StringIO für meine CSV-Lesung. Ich konnte das Problem einfacher lösen, indem ich Trennzeichen explizit ersetzte:

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

Könnte für enorme CSV-Dateien nicht sinnvoll sein, hat aber für meinen Anwendungsfall gut funktioniert.

Dougyfresh
quelle
Das hat mein Problem gelöst. Danke. Schauen Sie hier
vom
0

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

p699
quelle