2012-05-16 70 views
7

我正在用django在python中開發應用程序。用戶可以上傳CSV文件。我使用文件上傳來獲取文件。但是,它不存儲在任何地方。我試圖從請求處理文件。當我試圖打開文件時,它會給出錯誤。我使用python中存在的CSV庫進行處理。根據django使用表單元素和屬性。我嘗試拿取上傳文件的請求對象也是django設計的對象。打開上傳的CSV文件時出現類型錯誤

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) 

下面的這行給出了錯誤。

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

給定的錯誤是:

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

請好心給你的建議,如果你有這個任何想法。 在此先感謝。

回答

5

open()將文件的名稱作爲參數,而不是文件對象本身。

你可以嘗試這樣的事:

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

這將產生一個IO錯誤 錯誤是IO錯誤:[錯誤2]沒有這樣的文件或目錄:u'Magazine.csv」 感謝您的建議 – Nazneen

+0

我的壞,但基本想法是讓上傳的路徑文件。試試我剛剛編輯的那個。 – zubinmehta

+0

這給出了屬性錯誤。我也嘗試過。 給出的錯誤是 AttributeError:'InMemoryUploadedFile'對象沒有屬性'temporary_file_path' – Nazneen

0

您會得到一個TypeError,因爲打開的內置函數需要一個字符串,該字符串是文件的路徑。

這是行不通的?

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

我不認爲文件對象有 – zubinmehta

+0

它不工作的open()方法。它說「NoneType:None」。謝謝您的建議 – Nazneen

+0

修改了建議。 InMemoryUploadedFile類實現[django.core.files模塊]中的open方法(https://docs.djangoproject.com/en/dev/ref/files/file/) – Schuh

8

不需要調用打開該文件,它已經打開。你應該能夠直接將它傳遞給DictReader。

+0

這一個也工作正常..非常感謝。我們可以直接通過。這種方式看起來非常好。非常感謝你 – Nazneen

8

這適用於的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)