Символ нового рядка 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

Відповіді:


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 знайдено
GrantU

4
Який варіант врешті спрацював? До речі, ви читаєте файл двічі: get_row_count()і get_column_count()- розглянути питання про читанні файлу в __init__і пам'ятайте , dataв self.data, а потім використовувати його в інших методах.
alecxe

+1 для розділених ліній (), що дозволяє уникнути возитися з різними параметрами форматування на OSX. Сподіваюся, він працює і на інших платформах ...
python1981

Чудова відповідь. Використовуючи - "dialect = csv.excel_tab", однак, викручує вихід при використанні з csv.DictReader. Просто опції «RU» працює чарівно , хоча
Мерфі

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) не вирішує проблему.
Підерман

1
На OS X працював csv Windows, відокремлений комами, MS DOS Comma Separated не став.
користувач2348114

31

Для Mac OS X збережіть свій файл CSV у форматі "Windows, розділений комами (.csv)".


1
дякую, це був необхідний інгредієнт, оскільки я використовую Mac w / MS office.
подорожні

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

5

Спробуйте спочатку запустити dos2unixімпортовані файли Windows


насправді немає можливості мені потрібно дозволити користувачу завантажувати csv як з Windows, так і з Mac, без будь-яких спеціальних змін. Імпорт був збережений з Excel (Windows) як CSV, тому, можливо, є щось додаткове, що потрібно зробити в Python, щоб прочитати їх?
ГрантУ

@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

Альтернативне і швидке рішення: я зіткнувся з тією ж помилкою. Я знову відкрив "wierd" файл csv у GNUMERIC на своїй машині lubuntu та експортував його як файл CSV. Це виправило проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.