อักขระบรรทัดใหม่ CSV ที่เห็นในข้อผิดพลาดของฟิลด์ที่ไม่ได้ใส่เครื่องหมาย


121

รหัสต่อไปนี้ใช้งานได้จนถึงวันนี้เมื่อฉันนำเข้าจากเครื่อง Windows และได้รับข้อผิดพลาดนี้:

อักขระบรรทัดใหม่ที่เห็นในฟิลด์ที่ไม่มีเครื่องหมายคำพูด - คุณต้องเปิดไฟล์ในโหมด universal-newline หรือไม่?

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

4
ตัวเลือกใดได้ผลในที่สุด? Btw คุณกำลังอ่านไฟล์ครั้งที่สอง: ในget_row_count()และในget_column_count()- พิจารณาการอ่านไฟล์ใน__init__และจำdataในself.dataแล้วใช้มันในวิธีการอื่น ๆ
alecxe

+1 สำหรับ Splitlines () ซึ่งหลีกเลี่ยงการยุ่งกับตัวเลือกการจัดรูปแบบต่างๆบน OSX หวังว่ามันจะใช้งานได้กับแพลตฟอร์มอื่น ๆ เช่นกัน ...
python1981

คำตอบที่ดี อย่างไรก็ตามการใช้ - "dialect = csv.excel_tab" ให้ขันสกรูเอาต์พุตเมื่อใช้กับ csv.DictReader เพียงแค่ตัวเลือก 'rU' ทำงานได้อย่างน่าอัศจรรย์
Murphy

52

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันพบปัญหาเดียวกันและไม่เห็นคำตอบที่ถูกต้องดังนั้นฉันจะลองดู

ข้อผิดพลาด Python:

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

เกิดจากการพยายามอ่านไฟล์ CSV ของ Macintosh (รูปแบบ OS X ก่อน) ไฟล์เหล่านี้เป็นไฟล์ข้อความที่ใช้ CR สำหรับจุดสิ้นสุดของบรรทัด หากมีการใช้ MS Office ให้แน่ใจว่าคุณเลือกอย่างใดอย่างหนึ่งธรรมดาCSVรูปแบบหรือCSV (MS-DOS) อย่าใช้ CSV (Macintosh)เป็นประเภท save-as

เวอร์ชัน 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, Windows Comma Separated csv ใช้งานได้ MS DOS Comma Separated ไม่ได้
user2348114

31

สำหรับ Mac OS X ให้บันทึกไฟล์ CSV ของคุณในรูปแบบ "Windows Comma Separated (.csv)"


1
ขอบคุณนั่นเป็นส่วนประกอบที่จำเป็นเนื่องจากฉันใช้ Mac กับ MS office
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

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)
Damian Yerrick

2

นี่เป็นข้อผิดพลาดที่ฉันต้องเผชิญ ฉันได้บันทึกไฟล์. csv ใน MAC OSX

ขณะบันทึกให้บันทึกเป็น "Windows Comma Separated Values ​​(.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 ขนาดใหญ่ แต่ใช้ได้ดีกับกรณีการใช้งานของฉัน


ที่แก้ปัญหาของฉันขอบคุณดู! นี่
อ๊อฟ

0

ทางเลือกอื่นและวิธีแก้ปัญหาที่รวดเร็ว: ฉันประสบกับข้อผิดพลาดเดียวกัน ฉันเปิดไฟล์ csv "wierd" ใน GNUMERIC บนเครื่อง lubuntu ของฉันและส่งออกไฟล์เป็นไฟล์ csv สิ่งนี้ช่วยแก้ไขปัญหาได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.