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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

3396閲覧

Python日本語CSV出力時のunicode問題で困っています。

Shota

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

2クリップ

投稿2017/11/27 15:36

###前提・実現したいこと
Python日本語CSV出力時のunicode問題で困っています。
python 2.7系であるサイトのテーブルの情報をスクレイピングし、csvに書き出そうとしています。Beautiful Soupを使ってスクレイピングしようとしているのですが、unicodeの問題でうまくCSVに出力できません。

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

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

###該当のソースコード

python

1# coding: UTF-8 2import urllib2 3import requests 4import csv 5from bs4 import BeautifulSoup 6 7soup = BeautifulSoup(res.text, "html.parser") 8trs = soup.find_all('table', attrs={'class': 'listtable'})[1] 9list = [] 10 11for tr in trs.findAll('tr')[1:]: 12 row = [] 13 no = tr.findAll('td')[0].string 14 name = tr.findAll('td')[1].string 15 if name is None: 16 name = "" 17 status = tr.findAll('td')[2].string 18 mvDate = tr.findAll('td')[9].string 19 if mvDate is None: 20 mvDate = "" 21 row.append(no) 22 row.append(name) 23 row.append(status) 24 row.append(mvDate) 25 26 list.append(row) 27 28f = open('some.csv', 'w') 29writer = csv.writer(f, lineterminator='\n') 30writer.writerows(list) 31f.close() 32 33#printすると以下のような出力結果になります。 34print str(list).decode("unicode-escape") 35[[u'001', u'佐々木', u'滞在', ''], [u'300A', u'田中', u'滞在', ''], [u'600B', u'山田', u'退居', u'2000/02/10'], [u'100C', u'加藤', u'滞在', ''], [u'123', u'中田', u'滞在', '']

python csv unicodeでググっていくつか参照して見てみましたが、あまりうまくいかずご質問させて頂きました。decodeして出力すると上記のような配列が返ってきます。よろしくお願いします。

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

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

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

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

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

LouiS0616

2017/11/27 15:38

Python3.xを使うという選択肢はないのでしょうか?
umyu

2017/11/27 17:53

質問文のスクレイピング対象のアドレスか、それが難しいようでしたら、BeautifulSoupのコンストラクタに渡しているres.textを文字列化して質問文に追加してくださいな。
guest

回答2

0

最良の方法は Python 3 へ移行することです。Python 3 ならば open 時にエンコーディング方式を指定するだけで全てが解決します。

python

1with open('some.csv', 'w', encoding='cp932') as f: 2 csv.writer(f).writerows(lis)

そもそも Python 2 は2年後にサポートが終了するので、なんにしろ移行が必要です。


もしどうしても Python 2 を使う理由があるのであれば、ご自身で Unicode を変換する処理を実装してください。

参考: http://docs.python.jp/2/library/csv.html#examplesclass UnicodeWriter のところです

投稿2017/11/28 01:30

miyahan

総合スコア3095

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

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

0

ベストアンサー

どうしても2.x環境でという制限があるのであれば…
pip install unicodecsvにてunicodecsv導入することでutf-8cp932で正常に保存できました。
参考:How to write UTF-8 in a CSV file

Python

1l = [[u'001', u'佐々木', u'滞在', ''], [u'300A', u'田中', u'滞在', ''], [u'600B', u'山田', u'退居', u'2000/02/10'], [u'100C', u'加藤', u'滞在', ''], [u'123', u'中田', u'滞在', '']] 2 3import unicodecsv as csv 4f = open('some.csv', 'w') 5writer = csv.writer(f, lineterminator='\n',encoding='utf-8') # 'cp932'でも出力可能 6writer.writerows(l) 7f.close()
001,佐々木,滞在, 300A,田中,滞在, 600B,山田,退居,2000/02/10 100C,加藤,滞在, 123,中田,滞在,

投稿2017/11/28 06:45

can110

総合スコア38233

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

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

Shota

2017/11/28 07:06

unicodecsvインストールして無事必要なデータをCSV化できました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問