Символ новой строки CSV, видимый в поле без кавычек
Следующий код работал до сегодняшнего дня, когда я импортировал с машины Windows и получил эту ошибку:
символ новой строки в поле без кавычек - нужно ли открывать файл в режиме универсальной новой строки?
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]
Как я могу исправить эту проблему?
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)
8 ответов
Будет хорошо увидеть сам файл csv, но это может сработать для вас, попробуйте, замените:
file_read = csv.reader(self.file)
с:
file_read = csv.reader(self.file, dialect=csv.excel_tab)
Или откройте файл с universal newline mode
и передать его csv.reader
, лайк:
reader = csv.reader(open(self.file, 'rU'), dialect=csv.excel_tab)
Или используйте splitlines()
, как это:
def read_file(self):
with open(self.file, 'r') as f:
data = [row for row in csv.reader(f.read().splitlines())]
return data
Я понимаю, что это старый пост, но столкнулся с той же проблемой и не вижу правильного ответа, поэтому попробую
Ошибка Python:
_csv.Error: new-line character seen in unquoted field
Вызывается попыткой чтения файлов CSV для Macintosh (предварительно отформатированных в OS X). Это текстовые файлы, которые используют CR для конца строки. При использовании MS Office убедитесь, что вы выбрали либо простой формат CSV, либо CSV (MS-DOS). Не используйте CSV (Macintosh) в качестве типа сохранения.
Моя предпочтительная версия EOL будет LF (Unix/Linux/Apple), но я не думаю, что MS Office предоставляет возможность сохранить в этом формате.
В Mac OS X сохраните файл CSV в формате "Windows Comma Separated (.csv)".
Если это происходит с вами на Mac (как это случилось со мной):
- Сохраните файл как
CSV (MS-DOS Comma-Separated)
Запустите следующий скрипт
with open(csv_filename, 'rU') as csvfile: csvreader = csv.reader(csvfile) for row in csvreader: print ', '.join(row)
Попробуй запустить dos2unix
на ваших окнах сначала импортируются файлы
Это ошибка, с которой я столкнулся. Я сохранил файл.csv в MAC OSX.
При сохранении сохраните его как "Значения, разделенные запятыми в Windows (.csv)", что решило проблему.
Это работало для меня на 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
Я знаю, что на это уже давно ответили, но не решили мою проблему. Я использую DictReader и StringIO для чтения csv из-за некоторых других сложностей. Я смог решить проблему проще, явно заменив разделители:
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')
Может быть неприемлемо для огромных CSV-файлов, но хорошо подошло для моего случая использования.
Альтернативное и быстрое решение: я столкнулся с той же ошибкой. Я снова открыл "wierd" CSV-файл в GNUMERIC на моем компьютере с lubuntu и экспортировал этот файл как CSV-файл. Это исправило проблему.