2013-06-26 27 views
104

đoạn mã sau làm việc đến ngày hôm nay khi tôi được nhập khẩu từ một máy tính Windows và đã nhận lỗi này:CSV mới dòng nhân vật nhìn thấy trong lỗi lĩnh vực không thể viện chứng

mới dòng nhân vật nhìn thấy trong lĩnh vực không thể viện chứng - làm bạn cần phải mở tệp trong chế độ phổ-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] 

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) 
+0

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

Trả lời

166

Nó sẽ được tốt để xem tập tin csv bản thân, nhưng điều này có thể làm việc cho bạn, cung cấp cho nó một 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 tin với universal newline mode và vượt qua 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 
+0

' 'Bây giờ cho cùng một lỗi, nhưng trên dòng bắt đầu upload.num_records = csvobject.get_row_count() bây giờ – GrantU

+0

và khi tôi thử phiên bản dòng phân chia (rất rất lạnh), tôi bị ép buộc vào Unicode: cần chuỗi hoặc bộ đệ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: trong 'get_row_count()' và trong 'get_column_count()' - hãy xem xét đọc tệp trong '__init__' và nhớ' dữ liệu' trong 'self.data', sau đó sử dụng nó theo các phương thức khác. – alecxe

6

Cố gắng chạy dos2unix trên cửa sổ của bạn nhập khẩu file đầu tiên

+0

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 không có bất kỳ sửa đổi đặc biệt nào. Nhập khẩu được lưu từ Excel (Windows) dưới dạng CSV để có thể có thêm một số thứ cần phải thực hiện bằng Python để đọc chúng? – GrantU

+0

@GrantU Bạn đang đề cập đến Mac OS X 10.0 hoặc mới hơn, không phải Mac OS 9 hoặc cũ hơn, đúng không? Từ 9 đến 10, Mac OS đã chuyển từ kết thúc dòng '\ x0d' (ProDOS) sang dòng kết thúc' \ x0a' (UNIX) ' –

47

Tôi nhận ra đây là một bài cũ, nhưng tôi chạy vào cùng một vấn đề và không thấy câu trả lời chính xác để tôi sẽ cung cấp cho nó một thử

Python Lỗi:

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

gây ra bằng cách cố gắng để đọc tệp CSV (định dạng trước X được định dạng 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 đơn giản là CSV hoặc CSV (MS-DOS). Không sử dụng CSV (Macintosh) làm loại lưu.

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ĩ rằng MS Office cung cấp tùy chọn lưu ở định dạng này.

+4

MS DOS Comma Separated không hoạt động cho tôi (cùng một lỗi), nhưng Windows Comma được tách riêng. – tmthyjames

+3

Nếu bạn đang sử dụng máy Mac, đây hoàn toàn là câu trả lời đúng. – metaDNA

+0

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

29

Đố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, như tôi đang sử dụng Mac w/MS văn phòng. – travelingbones

16

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

  1. Lưu tập tin như CSV (MS-DOS Comma-Separated)
  2. Chạy kịch bản sau đây

    with open(csv_filename, 'rU') as csvfile: 
        csvreader = csv.reader(csvfile) 
        for row in csvreader: 
         print ', '.join(row) 
    
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

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

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

Các vấn đề liên quan