Ký tự dòng mới CSV được nhìn thấy trong lỗi trường không được trích dẫn


121

mã sau hoạt động cho đến hôm nay khi tôi nhập từ máy Windows và gặp lỗi này:

ký tự dòng mới được nhìn thấy trong trường không được trích dẫn - bạn có cần mở tệp ở chế độ dòng mới phổ quát không?

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]

Làm cách nào để khắc phục sự cố này?

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)

Câu trả lời của directummelancolique dưới đây là những gì đã giải quyết được vấn đề tương tự của tôi. stackoverflow.com/a/17315726/3131666
kmantel

Câu trả lời:


181

Sẽ rất tốt nếu bạn thấy chính tệp csv, nhưng điều này có thể hiệu quả với bạn, hãy thử, thay thế:

file_read = csv.reader(self.file)

với:

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

Hoặc, mở một tệp bằng universal newline modevà chuyển nó đến csv.reader, như:

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

Hoặc, sử dụng splitlines(), như thế này:

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

Điều này hiện gây ra cùng một lỗi, nhưng đang bắt đầu upload.num_records = csvobject.get_row_count () ngay bây giờ
GrantU

1
và khi tôi thử phiên bản dòng chia (được rất mát nhờ) tôi nhận được ép buộc sang Unicode: cần chuỗi hoặc đệm, S3BotoStorageFile tìm thấy
GrantU

4
Tùy chọn nào cuối cùng đã hoạt động? Btw, bạn đang đọc tệp hai lần: in get_row_count()và in get_column_count()- hãy xem xét việc đọc tệp trong __init__và ghi nhớ datatrong self.data, sau đó sử dụng nó trong các phương pháp khác.
alecxe

+1 cho các đường phân tách () tránh làm rối tung các tùy chọn định dạng khác nhau trên OSX. Hy vọng nó hoạt động trên nhiều nền tảng khác quá ...
python1981

Câu trả lời chính xác. Tuy nhiên, việc sử dụng - "dialect = csv.excel_tab" sẽ vặn đầu ra khi được sử dụng với csv.DictReader. Chỉ là 'RU' tùy chọn làm việc kỳ diệu dù
Murphy

52

Tôi nhận ra đây là một bài viết cũ, nhưng tôi đã gặp phải vấn đề tương tự và không thấy câu trả lời chính xác nên tôi sẽ thử

Lỗi Python:

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

Nguyên nhân do cố đọc tệp CSV của Macintosh (được định dạng trước OS X). Đây là các tệp văn bản sử dụng CR cho cuối dòng. Nếu sử dụng MS Office, hãy đảm bảo bạn chọn định dạng CSV thuần túy hoặc CSV (MS-DOS) . Không sử dụng CSV (Macintosh) làm loại lưu dưới dạng.

Phiên bản EOL ưa thích của tôi sẽ là LF (Unix / Linux / Apple), nhưng tôi không nghĩ MS Office cung cấp tùy chọn lưu ở định dạng này.


4
MS DOS Phân tách bằng dấu phẩy không hoạt động với tôi (cùng một lỗi), nhưng Windows đã tách bằng dấu phẩy.
tmthyjames

3
Nếu bạn đang sử dụng máy Mac, đây hoàn toàn là câu trả lời chính xác.
HashHazard

Tôi gặp vấn đề tương tự trên OS X. Tôi thấy mình phải tạo tệp CSV mới. Chỉ cần lưu hiện tại dưới dạng CSV thuần túy hoặc CSV (MS-DOS) không khắc phục được sự cố.
Pyderman

1
Trên OS X, csv Windows Comma Separated hoạt động, MS DOS Comma Separated không hoạt động.
user2348114

31

Đối với Mac OS X, hãy lưu tệp CSV của bạn ở định dạng "Windows Comma Separated (.csv)".


1
cảm ơn, đó là thành phần cần thiết, vì tôi đang sử dụng Mac w / MS office.
du lịch vào

18

Nếu điều này xảy ra với bạn trên mac (như nó đã xảy ra với tôi):

  1. Lưu tệp dưới dạng CSV (MS-DOS Comma-Separated)
  2. Chạy tập lệnh sau

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

2
Bạn vừa làm rung chuyển thế giới của tôi.
kta

5

Trước tiên, hãy thử chạy dos2unixtrên các tệp đã nhập cửa sổ của bạn


không thực sự là một tùy chọn tôi cần để cho phép người dùng tải lên csv từ cả Windows và Mac mà không có bất kỳ sửa đổi đặc biệt nào. Quá trình nhập đã được lưu từ Excel (Windows) dưới dạng CSV vì vậy có thể cần phải thực hiện thêm điều gì đó bằng Python để đọc chúng?
GrantU

@GrantU Bạn đang đề cập đến Mac OS X 10.0 trở lên, không phải Mac OS 9 trở xuống, đúng không? Từ 9 đến 10, Mac OS chuyển từ \x0dphần cuối dòng (ProDOS) sang phần cuối dòng \x0a(UNIX).
Damian Yerrick

2

Đây là một lỗi mà tôi phải đối mặt. Tôi đã lưu tệp .csv trong MAC OSX.

Trong khi lưu, hãy lưu nó dưới dạng "Các giá trị được phân tách bằng dấu phẩy của Windows (.csv)" để giải quyết sự cố.


1

Điều này đã làm việc cho tôi trên 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

Tôi biết điều này đã được trả lời trong một thời gian khá lâu nhưng không giải quyết được vấn đề của tôi. Tôi đang sử dụng DictReader và StringIO để đọc csv của mình do một số biến chứng khác. Tôi đã có thể giải quyết vấn đề đơn giản hơn bằng cách thay thế các dấu phân cách một cách rõ ràng:

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

Có thể không hợp lý với các tệp CSV khổng lồ, nhưng hoạt động tốt cho trường hợp sử dụng của tôi.


Đó là giải quyết vấn đề của tôi, Cảm ơn Nhìn kìa! Đây
AOF

0

Giải pháp thay thế và nhanh chóng: Tôi gặp phải lỗi tương tự. Tôi đã mở lại tệp csv "wierd" trong GNUMERIC trên máy lubuntu của mình và xuất tệp dưới dạng tệp csv. Điều này đã khắc phục sự cố.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.