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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

3回答

2070閲覧

pythonでmysqlconnectorを使う際

u_k_statistics

総合スコア44

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/09/26 09:28

pythonでmysqlを操作して、日本語を取り出しその後それをcsvに書き込みたいのですが、
res = cursor.fetchall()
で取り出した後に、どこかで
.encode('cp932')
を行わないと文字化けしてしまうのでしたいのですが、タプルとリストはどちらも.encodeに対応していないというエラー内容が出てしまいました。
下記のようなプログラムで、.encode('cp932')をどのようにして組み込めば良いのでしょうか?
よろしくお願いします。
ちなみに一回のinsert_stmtで取り出す要素は複数個あります。(zz = 2 and aa = 2 and bb = 2に当てはまる a が複数あるため)

connect

1 user='root', 2 password='', 3 host='xxxx') 4 cursor = connect.cursor() 5 planname_lists = [] 6 for i in range(100): 7 cursor = connect.cursor() 8 insert_stmt = 'select a FROM aaaa WHERE zz = 2 and aa = 2 and bb = 2' 9 cursor.execute(insert_stmt) 10 res = cursor.fetchall() 11 for k in range(len(res)): 12 res[k] = list(res[k]) 13 connect.commit() 14 cursor.close() 15 connect.close()

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

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

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

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

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

HidenoriYamano

2016/12/25 17:43

ちゃんとベストアンサー選ばないとダメだよこうちゃん!
guest

回答3

0

cp932でなくとも、BOM付きUTF-8のcsvファイルを生成すれば文字化けしません。
cp932に変換できない文字の扱いを考えなくて済むので、お手軽です。
Pythonのマニュアル記述通りにコーディングすれば、以下の通りとなります。

まずは、Python-2.7系の場合です。

Python

1# -*- coding: utf-8 -*- 2import codecs 3import cStringIO 4import csv 5import mysql.connector 6 7SQL_SEARCH = "SELECT name, price FROM item" 8 9conn = mysql.connector.connect( 10 user='root', password='', host='xxxx', db='database') 11cursor = conn.cursor() 12with open('test.csv', 'wb') as f: 13 f.write(codecs.BOM_UTF8) # BOMを書き込む 14 csv_writer = UnicodeWriter(f) 15 for name, price in cursor.execute(SQL_SEARCH): 16 csv_writer.writerow([name, str(price)]) 17 18 19class UnicodeWriter: 20 def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 21 self.queue = cStringIO.StringIO() 22 self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 23 self.stream = f 24 self.encoding = encoding 25 26 def writerow(self, row): 27 self.writer.writerow([s.encode("utf-8") for s in row]) 28 data = self.queue.getvalue() 29 if isinstance(data, unicode): 30 data = data.decode('utf-8').encode(self.encoding, 'replace') 31 self.stream.write(data) 32 self.queue.truncate(0) 33 34 def writerows(self, rows): 35 for row in rows: 36 self.writerow(row)

次はPython3の場合。

Python

1# -*- coding: utf-8 -*- 2import csv 3import mysql.connector 4 5SQL_SEARCH = "SELECT name, price FROM item" 6 7conn = mysql.connector.connect( 8 user='root', password='', host='xxxx', db='database') 9 10cursor = conn.cursor() 11with open('test.csv', 'w', newline='', encoding='utf-8-sig') as f: 12 csv_writer = csv.writer(f) 13 for name, price in cursor.execute(SQL_SEARCH): 14 csv_writer.writerow([name, price])

投稿2016/09/29 12:50

EloiseSeverin

総合スコア50

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

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

0

ちゃんとベストアンサー選ばないとダメだよこうちゃん!

投稿2016/12/25 17:42

HidenoriYamano

総合スコア60

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

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

0

MySQLはUTF-8かなんかで、出力CSVをCP932にしたいということですよね?
であれば、codecs モジュールを使ってCSVを cp932 で開いてあげれば、あとは勝手にやってくれます。

python

1import csv 2import codecs 3 4with codecs.open('hoge.csv', 'wb', 'cp932') as f: 5 csv.writer(f).writerow(['ひらがな','カタカナ','漢字'])

投稿2016/09/28 09:28

miyahan

総合スコア3095

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問