2012-05-16 42 views
7

Tôi đang phát triển một ứng dụng bằng python với django. Người dùng có thể tải lên tệp CSV. Tôi sử dụng tải lên tệp để tải tệp. Nhưng, nó không được lưu trữ ở bất kỳ đâu. Tôi cố gắng lấy nó từ yêu cầu để xử lý tệp. Trong khi tôi đang cố gắng để mở tập tin, nó đưa ra một lỗi. Tôi sử dụng thư viện CSV tồn tại trong python để xử lý. Các phần tử và thuộc tính biểu mẫu được sử dụng theo django. Yêu cầu đối tượng mà tôi cố gắng để lấy các tập tin được tải lên cũng là django đối tượng được thiết kế.Bắt lỗi Loại khi mở Tệp CSV đã tải lên

import csv 
from rootFolder.UploadFileForm 

def uploadFile(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES) 
     if form.is_valid(): 
      paramFile = open(request.FILES['uploadFile'], 'rb') 
      portfolio = csv.DictReader(paramFile) 
      users = [] 
      for row in portfolio: 
       users.append(row) 

Dòng dưới đây đưa ra lỗi.

paramFile = open(request.FILES['uploadFile'], 'rb') 

Các lỗi được đưa ra là:

TypeError: coercing to Unicode: need string or buffer, InMemoryUploadedFile found 

Xin vui lòng cung cấp cho đề xuất của bạn nếu bạn có bất kỳ ý tưởng về vấn đề này. Cảm ơn trước.

Trả lời

5

open() lấy tên của tệp làm đối số chứ không phải chính đối tượng tệp.

Bạn có thể thử một cái gì đó như thế này:

paramFile = request.FILES['uploadFile'].read() 
portfolio = csv.DictReader(paramFile) 
+0

điều này tạo ra lỗi IO Lỗi là IOError: [Errno 2] Không có tệp hoặc thư mục nào như vậy: u'Magazine.csv ' THanks cho đề xuất của bạn – Nazneen

+0

Điều xấu của tôi, nhưng về cơ bản ý tưởng là lấy đường dẫn của tệp đã tải lên tập tin. Hãy thử một tôi chỉ cần chỉnh sửa. – zubinmehta

+0

Điều này cho biết lỗi thuộc tính. Tôi cũng đã thử điều này trước đây. lỗi được cho là AttributeError: đối tượng 'InMemoryUploadedFile' không có thuộc tính 'temporary_file_path' – Nazneen

0

Bạn nhận được một TypeError, bởi vì các chức năng được xây dựng trong mở mong đợi một chuỗi đó là một đường dẫn đến một tập tin.

Tính năng này có hoạt động không?

if form.is_valid(): 
     request.FILES['uploadFile'].open("rb") 
     portfolio = csv.DictReader(request.FILES['uploadFile'].file) 
+0

Tôi không nghĩ rằng đối tượng tập tin có một phương pháp open() – zubinmehta

+0

Nó không phải là làm việc. Nó nói "NoneType: None" .. THanks cho đề xuất – Nazneen

+0

Đã chỉnh sửa đề xuất. Lớp InMemoryUploadedFile thực hiện phương thức mở từ mô-đun [django.core.files] (https://docs.djangoproject.com/en/dev/ref/files/file/) – Schuh

8

Không cần phải gọi mở trên các tập tin, nó đã được mở. Bạn sẽ có thể chuyển nó thẳng vào DictReader.

+0

Điều này cũng hoạt động tốt .. Cảm ơn rất nhiều. chúng ta có thể vượt qua trực tiếp. Cách này có vẻ thực sự tốt. Cảm ơn nhiều – Nazneen

8

này làm việc cho Python 3

import csv 
import io 

... 

csv_file = request.FILES['uploadFile'] 
decoded_file = csv_file.read().decode('utf-8') 
io_string = io.StringIO(decoded_file) 
for line in csv.reader(io_string, delimiter=';', quotechar='|'): 
    print(line) 
Các vấn đề liên quan