7

多くのフィールド (約 24) を持つ Django モデルがあり、ユーザーはすべてのデータを手動でフォームに入力する代わりに、スプレッドシートのアップロードを使用してこのオブジェクトのインスタンスを作成できるようにしたいと考えています。

Python の組み込み CSV モジュールを使用すると、これがかなり簡単になることがわかりましたが、正確に使用する方法を理解するのに苦労しています。

コードに関して私が持っているものから始めましょう:

def upload_file(request):

  if request.method == "POST":
    form = UploadFileForm(request.POST, request.FILES)
    if form.is_valid():
      handle_files(request.FILES['file'])
      return HttpResponseRedirect('/workflow/')
    else:
      print form.errors
      print request.FILES
      return HttpResponseRedirect('/workflow/upload')
  else:
    form = UploadFileForm()
    return render(request, 'fileform.html', {'formset': form})

handle_filesこれはアップロードとして CSV ファイルを受け入れ、解析とオブジェクトの作成を処理するためにそれを渡します。これは私が問題を抱えている方法です。

def handle_files(f):
    reader = csv.DictReader(f, delimiter=' ', quotechar='|')
    ... #?

Python ドキュメント ( http://docs.python.org/2/library/csv.html )を模倣しようとしましたが、DictReader のドキュメントはほとんどありません。csv.DictReader()適切な引数を指定していますか? 持っている場合、どうすれば から情報を取得できreaderますか? ユーザーにテンプレートを提供するので、CSV ファイルの各列には予測可能なデータがあると想定できます。つまり、列 A にはフィールド X に対応するデータがあり、列 B は Y に対応する、というようになります。リーダーからのデータを解析し、そのデータを使用してオブジェクトを作成するにはどうすればよいでしょうか?

私はそれが次のようなものになると推測しています:

for row in reader:
    X=row[1]
    Y=row[2]
    #etc
    my_object = MyObject(x=X, y=Y)
    my_object.save()

この道はずれですか?別のタイプの CSV リーダーを使用する必要がありますか?

この投稿には多くの質問があることを知っています。

4

2 に答える 2

4

csv ファイルの作成中に、ヘッダーを追加します。

人.csv

id  age  height
1   20   62
2   22   74
3   24   68

def handle_files(f):
    reader = csv.DictReader(open(f))
    for row in reader:
        id=row['id']
        age=row['age']
        height=row['height']
        my_object = MyObject(id=id, age=age,height=height)
        my_object.save()
于 2013-07-29T17:47:22.243 に答える