CSV-символ новой строки отображается в поле без кавычек ошибка


121

следующий код работал до сегодняшнего дня, когда я импортировал с компьютера 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)

Ответ rectummelancolique ниже - это то, что решило мою аналогичную проблему. stackoverflow.com/a/17315726/3131666
kmantel 09

Ответы:


181

Было бы хорошо увидеть сам файл 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

Теперь это дает ту же ошибку, но теперь в сети запускается upload.num_records = csvobject.get_row_count ()
GrantU

1
и когда я пробую версию с разделенными строками (что очень здорово, спасибо), я получаю принудительное использование Unicode: нужна строка или буфер, найден
S3BotoStorageFile

4
Какой вариант в итоге сработал? Кстати, вы читаете файл дважды: get_row_count()и get_column_count()- рассмотреть вопрос о чтении файла в __init__и помните , dataв self.data, а затем использовать его в других методах.
alecxe

+1 для splitlines (), что позволяет избежать возни с различными параметрами форматирования в OSX. Надеюсь, он работает и на других платформах ...
python1981, 02

Отличный ответ. Однако использование - "dialect = csv.excel_tab" портит вывод при использовании с csv.DictReader. Хотя просто
Мерфи

52

Я понимаю, что это старый пост, но я столкнулся с той же проблемой и не вижу правильного ответа, поэтому я попробую

Ошибка 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 предоставляет возможность сохранения в этом формате.


4
MS DOS Comma Separated не сработала для меня (та же ошибка), но Windows Comma Separated.
tmthyjames

3
Если у вас Mac, это абсолютно правильный ответ.
HashHazard

У меня такая же проблема с OS X. Мне нужно создать новый файл CSV. Простое сохранение текущего в обычном формате CSV или CSV (MS-DOS) не решает проблему.
Pyderman

1
В OS X csv, разделенный запятыми Windows, работал, а разделенный запятыми MS DOS - нет.
user2348114

31

Для Mac OS X сохраните файл CSV в формате «Windows Comma Separated (.csv)».


1
спасибо, это был необходимый ингредиент, так как я использую Mac с офисом MS.
travelingbones

18

Если это произойдет с вами на Mac (как это случилось со мной):

  1. Сохраните файл как CSV (MS-DOS Comma-Separated)
  2. Запустите следующий скрипт

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

2
Вы только что потрясли мой мир.
kta 05

5

Попробуйте dos2unixсначала запустить импортированные файлы Windows


На самом деле мне не нужно позволять пользователю загружать csv как с Windows, так и с Mac без каких-либо специальных изменений. Импорт был сохранен из Excel (Windows) как CSV, так что, может быть, нужно что-то еще сделать в Python, чтобы их прочитать?
GrantU

@GrantU Вы имеете в виду Mac OS X 10.0 или новее, а не Mac OS 9 или более раннюю версию, верно? Между 9 и 10 Mac OS переключилась с \x0dокончаний строк (ProDOS) на окончания строк \x0a(UNIX).
Дамиан Йеррик

2

Это ошибка, с которой я столкнулся. Я сохранил файл .csv в MAC OSX.

При сохранении сохраните его как «Значения, разделенные запятыми Windows (.csv)», что устранило проблему.


1

Это сработало для меня на 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

Я знаю, что на этот вопрос уже довольно давно ответили, но не решаю мою проблему. Я использую 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, но хорошо сработал для моего варианта использования.


Это решило мою проблему, спасибо Смотрите! Здесь
AOF

0

Альтернативное и быстрое решение: я столкнулся с той же ошибкой. Я повторно открыл "странный" файл csv в GNUMERIC на моем компьютере с lubuntu и экспортировал файл как файл csv. Это устранило проблему.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.