Mở tệp ở chế độ phổ quát-dòng mới bằng mô-đun CSV Django


86

Tôi đang cố gắng truy cập a model.filefieldtrong Django để phân tích cú pháp tệp CSV bằng Python bằng csvmô-đun. Nó hoạt động trên Windows, nhưng trên Mac, nó cho tôi điều này:

Exception Type: Error

Exception Value: new-line character seen in unquoted field - do you need to open the file in universal-newline mode?

Đây là mã:

myfile = customerbulk.objects.all()[0].fileup

mydata = csv.reader(myfile)
    for email,mobile,name,civilid in mydata:
        print email,mobile,name,civilid

cái gì đây customerbulk.objects.all()[0].fileup. Nó có phải là một tên tập tin trên một mô hình?
SingleNegationElimination

fileup = models.FileField (verbose_name = "CsvFile", upload_to = 'ExcelFiles') nếu tôi thực hiện một truy vấn nhỏ như customerbulk.objects.get (pk = 1)
Mohd

1
Lý do chính xác của việc sử dụng rU(Nó liên quan đến () chức năng mở và không phải là csv cụ thể.): In addition to the standard fopen() values mode may be 'U' or 'rU'. Python is usually built with universal newlines support; supplying 'U' opens the file as a text file, but lines may be terminated by any of the following: the Unix end-of-line convention '\n', the Macintosh convention '\r', or the Windows convention '\r\n'. Docs.python.org/2/library/functions.html#open
zengr

Trong Python> = 3, sử dụng newline=''thay vì mode='U'.
tricasse

Câu trả lời:


150

Cuối cùng tôi đã tìm ra giải pháp:

mypath = customerbulk.objects.get(pk=1).fileup.path
o = open(mypath,'rU')
mydata = csv.reader(o)

2
Tôi tin rằng bạn có thể đơn giản hóa điều này. Có vẻ kỳ lạ khi tìm cách bắt đầu sau khi chỉ mở tệp. Phần sau đã giúp tôi khắc phục sự cố tương tự khi xuất bảng tính Excel sang CSV bằng cách sử dụng các giá trị mặc định: data = csv.reader (open (FILENAME, 'rU'), quotechar = '"', delimiter = ',')
timbo

4
Có, không cần phải tìm kiếm đầu tệp ngay sau khi mở. Bit >>> o = open (mypath, 'rU'), với cờ 'rU' là phép thuật quan trọng đã hoạt động trong trường hợp của tôi.
rd108,

13
PEP278 giải thích những gì rUlà viết tắt của:In a Python with universal newline support open() the mode parameter can also be "U", meaning "open for input as a text file with universal newline interpretation". Mode "rU" is also allowed, for symmetry with "rb".
Xiao

@Xiao +1 để liên kết với PEP gốc, điều này giải thích cơ sở lý luận.
Naymesh Mistry

Trong Python> = 3, hãy sử dụng newlinethay thế, mặc định newline=Nonelà giống như newline=''ngoại trừ nó cũng dịch các dòng mới sang \n. Tôi không chắc chắn mà trong số này là tương đương vớimode='U'
timdiels
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.