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)
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
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.
Speichern Sie Ihre CSV-Datei unter Mac OS X im Format "Windows Comma Separated (.csv)".
Wenn Ihnen dies passiert auf Mac (wie es mir passiert ist):
CSV (MS-DOS Comma-Separated)
.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)
Versuchen Sie zuerst, dos2unix
für Ihre mit Windows importierten Dateien auszuführen
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.
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
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.
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.