Karakter baris baru CSV terlihat dalam kesalahan bidang tanpa tanda kutip


121

kode berikut berfungsi hingga hari ini ketika saya mengimpor dari mesin Windows dan mendapatkan kesalahan ini:

karakter baris baru terlihat di bidang tanpa tanda kutip - apakah Anda perlu membuka file dalam mode baris baru universal?

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]

Bagaimana cara memperbaiki masalah ini?

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)

jawaban rectummelancolique di bawah ini adalah yang memecahkan masalah serupa saya. stackoverflow.com/a/17315726/3131666
kmantel

Jawaban:


181

Sebaiknya Anda melihat file csv itu sendiri, tetapi ini mungkin berhasil untuk Anda, cobalah, ganti:

file_read = csv.reader(self.file)

dengan:

file_read = csv.reader(self.file, dialect=csv.excel_tab)

Atau, buka file dengan universal newline modedan berikan ke csv.reader, seperti:

reader = csv.reader(open(self.file, 'rU'), dialect=csv.excel_tab)

Atau, gunakan splitlines(), seperti ini:

def read_file(self):
    with open(self.file, 'r') as f:
        data = [row for row in csv.reader(f.read().splitlines())]
    return data

Ini sekarang memberikan kesalahan yang sama, tetapi secara online mulai upload.num_records = csvobject.get_row_count () sekarang
GrantU

1
dan ketika saya mencoba versi garis terpisah (yang sangat keren terima kasih) saya memaksa ke Unicode: perlu string atau buffer, S3BotoStorageFile ditemukan
GrantU

4
Pilihan apa yang akhirnya berhasil? Btw, Anda membaca file dua kali: di get_row_count()dan di get_column_count()- mempertimbangkan membaca file dalam __init__dan ingat datadi self.data, kemudian menggunakannya dalam metode lain.
alecxe

1 untuk garis terpisah () yang menghindari bermain-main dengan opsi pemformatan yang berbeda di OSX. Semoga bisa berfungsi di platform lain juga ...
python1981

Jawaban yang bagus. Namun, menggunakan - "dialect = csv.excel_tab", mengencangkan output saat digunakan dengan csv.DictReader. Hanya opsi 'rU' yang bekerja secara ajaib
Murphy

52

Saya menyadari ini adalah posting lama, tetapi saya mengalami masalah yang sama dan tidak melihat jawaban yang benar jadi saya akan mencobanya

Kesalahan Python:

_csv.Error: new-line character seen in unquoted field

Disebabkan oleh mencoba membaca file CSV Macintosh (pra OS X diformat). Ini adalah file teks yang menggunakan CR untuk akhir baris. Jika menggunakan MS Office pastikan Anda memilih format CSV biasa atau CSV (MS-DOS) . Jangan gunakan CSV (Macintosh) sebagai tipe simpan-sebagai.

Versi EOL pilihan saya adalah LF (Unix / Linux / Apple), tetapi menurut saya MS Office tidak menyediakan opsi untuk menyimpan dalam format ini.


4
MS DOS Comma Separated tidak berfungsi untuk saya (kesalahan yang sama), tetapi Windows Comma Separated.
tmthyjames

3
Jika Anda menggunakan Mac, ini benar-benar jawaban yang benar.
HashHazard

Saya mendapatkan masalah yang sama di OS X. Saya harus membuat file CSV baru. Cukup menyimpan format CSV saat ini sebagai format CSV atau CSV (MS-DOS) tidak akan menyelesaikan masalah.
Pyderman

1
Pada OS X, Windows Comma Separated csv berfungsi, sedangkan MS DOS Comma Separated tidak.
pengguna2348114

31

Untuk Mac OS X, simpan file CSV Anda dalam format "Windows Comma Separated (.csv)".


1
terima kasih, itu bahan yang dibutuhkan, karena saya menggunakan Mac dengan kantor MS.
travelingbones

18

Jika ini terjadi pada Anda di mac (seperti yang terjadi pada saya):

  1. Simpan file sebagai CSV (MS-DOS Comma-Separated)
  2. Jalankan script berikut

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

2
Anda baru saja mengguncang dunia saya.
kta

5

Coba jalankan dos2unixdi windows Anda file yang diimpor terlebih dahulu


tidak ada pilihan yang benar-benar saya perlukan untuk mengizinkan pengguna mengunggah csv dari Windows dan Mac tanpa modifikasi khusus. Impor disimpan dari Excel (Windows) sebagai CSV jadi mungkin ada sesuatu tambahan yang perlu dilakukan dengan Python untuk membacanya?
GrantU

@GrantU Anda mengacu pada Mac OS X 10.0 atau yang lebih baru, bukan Mac OS 9 atau yang lebih lama, benar? Antara 9 dan 10, Mac OS beralih dari \x0dakhir baris (ProDOS) ke akhir baris \x0a(UNIX).
Damian Yerrick

2

Ini adalah kesalahan yang saya hadapi. Saya telah menyimpan file .csv di MAC OSX.

Saat menyimpan, simpan sebagai "Nilai Dipisahkan Koma Windows (.csv)" yang menyelesaikan masalah.


1

Ini berhasil untuk saya di 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

Saya tahu ini telah dijawab cukup lama tetapi tidak menyelesaikan masalah saya. Saya menggunakan DictReader dan StringIO untuk membaca csv saya karena beberapa komplikasi lain. Saya dapat menyelesaikan masalah lebih sederhana dengan mengganti pembatas secara eksplisit:

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

Mungkin tidak masuk akal untuk file CSV yang sangat besar, tetapi berfungsi dengan baik untuk kasus penggunaan saya.


Itu memecahkan masalah saya, Thanks Lihatlah! Sini
aof

0

Solusi alternatif dan cepat: Saya menghadapi kesalahan yang sama. Saya membuka kembali file csv "wierd" di GNUMERIC di mesin lubuntu saya dan mengekspor file tersebut sebagai file csv. Ini memperbaiki masalah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.