質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1502閲覧

Django:CSVインポートでAttributeError

pakapaka_alpaca

総合スコア10

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/02/27 07:35

前提・実現したいこと

Python:3.7.1
Django:2.1.2

Python学習中の初心者であることをご容赦ください。
Python・DjangoでWebアプリみたいなものを作ろうと考えています。
アプリ自体は他の方が公開しているテンプレートを利用したうえで
CSVからインポートする機能を加えようと思ったのですが、
下記エラーが発生します。

サンプルコードのコピペがメインのため
変なコードが入っているとは思いますが、
知恵をお貸しいただけないでしょうか。

発生している問題・エラーメッセージ

2019-02-27 15:03:02,136 [ERROR] C:\Users\user\Desktop\instantapp\env\l ib\site-packages\django\utils\log.py:228 Internal Server Error: /import/ Traceback (most recent call last): File "C:\Users\user\Desktop\instantapp\env\lib\site-packages\django\ core\handlers\exception.py", line 34, in inner response = get_response(request) File "C:\Users\user\Desktop\instantapp\env\lib\site-packages\django\ core\handlers\base.py", line 126, in _get_response response = self.process_exception_by_middleware(e, request) File "C:\Users\user\Desktop\instantapp\env\lib\site-packages\django\ core\handlers\base.py", line 124, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\user\Desktop\instantapp\env\lib\site-packages\django\ views\generic\base.py", line 68, in view return self.dispatch(request, *args, **kwargs) File "C:\Users\user\Desktop\instantapp\env\lib\site-packages\django\ views\generic\base.py", line 88, in dispatch return handler(request, *args, **kwargs) File "C:\Users\user\Desktop\instantapp\env\lib\site-packages\django\ views\generic\edit.py", line 142, in post return self.form_valid(form) File "C:\Users\user\Desktop\instantapp\app\views.py", line 188, in f orm_valid for row in reader: File "C:\Users\user\Desktop\instantapp\env\lib\site-packages\unicode csv\py3.py", line 55, in __next__ return self.reader.__next__() File "C:\Users\user\Desktop\instantapp\env\lib\site-packages\unicode csv\py3.py", line 51, in <genexpr> f = (bs.decode(encoding, errors=errors) for bs in f) AttributeError: 'str' object has no attribute 'decode' 2019-02-27 15:03:02,148 [ERROR] C:\Users\user\Desktop\instantapp\env\l ib\site-packages\django\core\servers\basehttp.py:124 "POST /import/ HTTP/1.1" 50 0 88777

該当のソースコード

Pyhon

1・views.py 2 3import unicodecsv as csv 4import urllib 5import io 6from django.views import generic 7from django.http import HttpResponse 8from django.urls import reverse_lazy 9 10from .forms import CSVUploadForm 11from .models import Item 12 13class ItemImport(generic.FormView): 14 template_name = 'app/item_import.html' 15 success_url = reverse_lazy('index') 16 form_class = CSVUploadForm 17 18 def form_valid(self, form): 19 csvfile = io.TextIOWrapper(form.cleaned_data['file'], encoding='cp932') 20 reader = csv.reader(csvfile) 21 for row in reader: 22 Item, created = Item.objects.get_or_create(pk=row[0]) 23 Item.name = row[1] 24 Item.save() 25 return super().form_valid(form) 26 27・forms.py 28 29class CSVUploadForm(forms.Form): 30 file = forms.FileField(label='CSVファイル') 31 32・urls.py 33 34urlpatterns = [ 35 path('import/', views.ItemImport.as_view(), name='import'), 36] 37 38

HTML

1・item_import.html 2 3{% extends 'app/_base.html' %} 4 5{% block headertitle %} 6CSVインポート 7{% endblock %} 8 9{% block content %} 10<form action="" method="POST" enctype="multipart/form-data"> 11 <p>ファイルを選択ボタンをクリックして、アップロードするCSVファイルを選択します</p> 12 {% csrf_token %} 13 <div class="form-group"> 14 {{form.file}} 15 </div> 16 <br/> 17 <button type="submit">送信</button> 18{% endblock %}

試したこと

・アプリ作成、機能追加の参考にしたサイト
https://qiita.com/okoppe8/items/4cc0f87ea933749f5a49

上記サイトを元にCSVのインポート・エクスポート機能を加えたく
下記サイトを参考にコードを追加しています。
https://qiita.com/t-iguchi/items/d2862e7ef7ec7f1b07e5
https://narito.ninja/blog/detail/60/

CSVエクスポートの機能を追加した際にcp932でエンコードする。
という記事を見つけたため、cp932でエクスポートをしています。
試しにviews.pyの
csvfile = io.TextIOWrapper(form.cleaned_data['file'], encoding='cp932')
上記部分でencodingをutf-8にし、utf-8のファイルをインポートしましたが
同様のエラーが発生しました。

どうぞよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wwbQzhMkhhgEmhU

2019/02/27 15:15 編集

djangoでなければ出来るのでしょうか? unicodecsv単品の使い方が分からないのであれば、それだけにソースを直してください。 django + unicodecsvの使い方が分からないのであれば、unicodecsv単品ならこう動くのに、djangoと一緒だとここが出来ない、のような説明にしてください。 また、コピペをするのは構いませんが、コピペしたコードは「完全に理解」してから使ってください。理解してないコードを使ってはいけません。それは背伸びしすぎです。
pakapaka_alpaca

2019/02/28 02:00

wwbQzhMkhhgEmhU様 ご回答ありがとうございます。 おっしゃるとおりで、自分には背伸びしすぎでした。 まだ「とりあえず何か使って作ってみよう」というレベルのため ・Djangoでなければできるのか ・unicodecsvの動作 等いただいた回答からも分からないことが山積みでした。 本件クローズし、使用しているコードと、使っている機能の理解しからしなおしたいと思います。
guest

回答1

0

自己解決

指摘を受け、まだ質問段階にないことを理解したため、クローズいたします。

2019/3/4:
まだまだここに書けるようなレベルではないかもしれませんが、解決しましたので追記します。
csv出力する際にShift_JISで出力する必要があったため
出力時にunicodecsvを利用しておりましたが、
入力でも同ライブラリを利用していためダメだったようです。
(unicodecsv単体でも同様のエラーが発生しましたので
デコードする必要のない値をデコードしようとしていたのでしょうか。)

csv出力にunicodecsv
csvからの入力にcsvを利用することで解決しました。

Python

1■views.py 2 3import csv 4import unicodecsv 5from django.http import HttpResponse 6from django.urls import reverse_lazy 7from .forms import CSVUploadForm 8from .models import Item 9 10・出力 11def export(request): 12 response = HttpResponse(content_type='text/csv') 13 response['Content-Disposition'] = 'attachment; filename="alldata.csv"' 14 writer = unicodecsv.writer(response, encoding='cp932') 15 for item in Item.objects.all(): 16 writer.writerow([書きだすアイテムたち]) 17 return response 18 19・入力 20class ItemImport(generic.FormView): 21 """ 22 データの登録(csvアップロード) 23 """ 24 template_name = 'app/item_import.html' 25 success_url = reverse_lazy('index') 26 form_class = CSVUploadForm 27 28 def form_valid(self, form): 29 csvfile = io.TextIOWrapper(form.cleaned_data['file'], encoding="cp932") 30 #encoding='cp932' 31 reader = csv.reader(csvfile) 32 for row in reader: 33 item, created = Item.objects.get_or_create(pk=row[0]) 34       [入力するアイテムたちと場所の指定] 35 item.save() 36 return super().form_valid(form)

この場を借りてアドバイスをいただけたwwbQzhMkhhgEmhU様に御礼を申し上げます。

投稿2019/02/28 02:02

編集2019/03/04 01:58
pakapaka_alpaca

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問