Tırnaksız alan hatasında görülen CSV yeni satır karakteri


121

Aşağıdaki kod, bir Windows makinesinden içe aktardığımda ve bu hatayı aldığımda bugüne kadar çalıştı:

tırnaksız alanda görülen yeni satır karakteri - dosyayı evrensel yeni satır modunda açmanız gerekiyor mu?

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]

Bu sorunu nasıl çözebilirim?

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'in aşağıdaki cevabı benzer sorunumu çözen şeydi. stackoverflow.com/a/17315726/3131666
kmantel

Yanıtlar:


181

Csv dosyasının kendisini görmek iyi olacak, ancak bu sizin için işe yarayabilir, bir deneyin, değiştirin:

file_read = csv.reader(self.file)

ile:

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

Veya bir dosyayı ile açın universal newline modeve aşağıdaki csv.readergibi iletin:

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

Veya şu şekilde kullanın splitlines():

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

Bu şimdi aynı hatayı veriyor, ancak artık upload.num_records = csvobject.get_row_count () başlatılıyor
GrantU

1
ve bölünmüş satır versiyonunu denediğimde (ki bu çok güzel, teşekkürler) Unicode'a zorlanıyorum: dize veya tampona ihtiyacım var, S3BotoStorageFile bulundu
GrantU

4
Sonunda hangi seçenek işe yaradı? Btw, iki kez dosyayı okuduğunuz: Giriş get_row_count()ve get_column_count()- düşünün dosyayı okuma __init__ve hatırlamak dataiçinde self.datadaha sonra diğer yöntemlerde kullanabilir.
alecxe

OSX'te farklı biçimlendirme seçenekleriyle uğraşmaktan kaçınan bölme çizgileri () için +1. Umarım diğer platformlarda da çalışır ...
python1981

Mükemmel cevap. Bununla birlikte - "dialect = csv.excel_tab" kullanıldığında, csv.DictReader ile kullanıldığında çıktıyı vidalar. Sadece 'rU' seçenekleri sihirli bir şekilde çalışıyor
Murphy

52

Bunun eski bir gönderi olduğunu anlıyorum, ancak aynı sorunla karşılaştım ve doğru cevabı göremiyorum, bu yüzden bir deneyeceğim

Python Hatası:

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

Macintosh (OS X öncesi biçimlendirilmiş) CSV dosyalarını okumaya çalışmaktan kaynaklanır. Bunlar, satır sonu için CR kullanan metin dosyalarıdır. MS Office kullanıyorsanız, düz CSV biçimini veya CSV (MS-DOS) biçimini seçtiğinizden emin olun . Farklı kaydetme türü olarak CSV (Macintosh) kullanmayın .

Tercih ettiğim EOL sürümü LF (Unix / Linux / Apple) olurdu, ancak MS Office'in bu formatta kaydetme seçeneği sunduğunu sanmıyorum.


4
MS DOS Virgülle Ayrılmış benim için çalışmadı (aynı hata), ancak Windows Virgülle Ayrılmış.
tmthyjames

3
Mac kullanıyorsanız, bu kesinlikle doğru cevaptır.
HashHazard

OS X'te de aynı sorunu yaşıyorum. Kendimi yeni bir CSV dosyası yapmak zorunda buluyorum. Geçerli olanı düz CSV biçimi veya CSV (MS-DOS) olarak kaydetmek sorunu çözmez.
Pyderman

1
OS X'te, Windows Virgülle Ayrılmış csv çalıştı, MS DOS Virgülle Ayrılmış çalışmadı.
user2348114

31

Mac OS X için, CSV dosyanızı "Windows Virgülle Ayrılmış (.csv)" biçiminde kaydedin.


1
teşekkürler, Mac w / MS office kullandığım için gerekli bileşen buydu.
travelingbones

18

Mac'te bu sana gelirse (bana yaptığı gibi):

  1. Dosyayı farklı kaydedin CSV (MS-DOS Comma-Separated)
  2. Aşağıdaki komut dosyasını çalıştırın

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

2
Az önce dünyamı sarstın.
kta

5

dos2unixÖnce içe aktarılan Windows dosyalarınızda çalıştırmayı deneyin


gerçekten bir seçenek yok Kullanıcının hem Windows hem de Mac'lerden herhangi bir özel değişiklik yapmadan csv yüklemesine izin vermem gerekiyor. İçe aktarma Excel'den (Windows) bir CSV olarak kaydedildi, bu nedenle Python'da bunları okumak için yapılması gereken fazladan bir şey olabilir mi?
GrantU

@GrantU Mac OS X 10.0 veya sonrasını kastediyorsunuz, Mac OS 9 veya önceki bir sürümünü değil, doğru mu? Mac OS, 9 ile 10 arasında, \x0d(ProDOS) satır sonlarından \x0a(UNIX) satır sonlarına geçti.
Damian Yerrick

2

Bu karşılaştığım bir hatadır. .Csv dosyasını MAC OSX'e kaydetmiştim.

Kaydederken, sorunu çözen "Windows Virgülle Ayrılmış Değerler (.csv)" olarak kaydedin.


1

Bu benim için OSX'te çalıştı.

# 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

Bunun epey bir süredir yanıtlandığını biliyorum ama sorunumu çözemedim. Diğer bazı komplikasyonlar nedeniyle csv okumam için DictReader ve StringIO kullanıyorum. Sınırlayıcıları açıkça değiştirerek sorunu daha basit bir şekilde çözebildim:

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

Çok büyük CSV dosyaları için makul olmayabilir, ancak benim kullanım durumum için iyi sonuç verdi.


Yani, Teşekkür benim sorun çözüldü bak! Buraya
aof

0

Alternatif ve hızlı çözüm: Aynı hatayla karşılaştım. "Wierd" csv dosyasını, lubuntu makinemde GNUMERIC'de yeniden açtım ve dosyayı csv dosyası olarak dışa aktardım. Bu sorunu düzeltti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.