15

私はdjangoを使ってPythonでアプリケーションを開発しています。ユーザーはCSVファイルをアップロードできます。ファイルのアップロードを使用してファイルを取得します。しかし、それはどこにも保存されていません。私はファイルを処理するためにリクエストからそれを取ろうとします。ファイルを開こうとするとエラーが発生します。Pythonに存在するCSVライブラリを使用して処理します。djangoごとに使用されるフォーム要素と属性。アップロードしたファイルを取得しようとするリクエストオブジェクトもdjangoデザインのオブジェクトです。

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

これについて何かアイデアがあれば、親切に提案してください。前もって感謝します。

4

5 に答える 5

19

これはPython3で機能します

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)
于 2017-01-28T15:04:45.340 に答える
13

ファイルに対してopenを呼び出す必要はありません。すでに開いています。DictReaderに直接渡すことができるはずです。

于 2012-05-16T11:50:47.797 に答える
11

open()は、ファイルオブジェクト自体ではなく、引数としてファイルの名前を取ります。

あなたはこのようなことを試すことができますか?

paramFile = request.FILES['uploadFile'].read()
portfolio = csv.DictReader(paramFile)
于 2012-05-16T11:19:42.437 に答える
9

Django 2、Python 3.6、同じ問題、半日のグーグル、これは私のために働いた解決策です。

form.is_valid:
  csv_file = request.FILES['file']
  csv_file.seek(0)
  reader = csv.DictReader(io.StringIO(csv_file.read().decode('utf-8')))

  for row in reader
     .....
     .....

詳細はこちら->ソース

于 2018-07-12T18:13:39.980 に答える
1

組み込み関数openは、ファイルへのパスである文字列を予期しているため、TypeErrorが発生します。

これは機能しますか?

    if form.is_valid():
        request.FILES['uploadFile'].open("rb")
        portfolio = csv.DictReader(request.FILES['uploadFile'].file)
于 2012-05-16T11:19:34.217 に答える