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

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

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

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

Q&A

1回答

2053閲覧

pythonのcsv.writerについて(機能)

u_k_statistics

総合スコア44

Python

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

0グッド

0クリップ

投稿2016/10/27 11:37

編集2016/10/28 07:56

pythonのcsv.writerを使って以下のことをしたいのですが可能でしょうか?
aというリストがありlen(a)=1であるとします。
bというリストがありlen(b)=10であるとします。
1.aをエクセルファイルの1列目から書く
2.bをエクセルファイルの2列目から書く
つまり各要素を
a=[a1]
b=[b1,b2,b3,b4,b5,b6,b7,b8,b9,b10]
とするとエクセルファイルには1行1列目〜1行11列目まで順番に
a1,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10
となってほしいのですができますでしょうか?
aとbを結合してから一気に書き込むことも考えたのですが、aのリストの内容が日本語表記なため個別に書き込まなければなりません。(私が以前複数の要素があるリストの中の一つだけ日本語表記が入っていた場合正しくエクセルファイルに書き込めなかったのでこのように考えるようになりました。もし日本語も数値も一度に正しくエクセルファイルに書き込む方法があれば、それが一番理想ですので教えていただけるとありがたいです。)
よろしくお願いします。

===追記===
Lhankor_Mhyさん
ご回答ありがとうございます。
正しく書き込めなかったというのは、書き込んだ際に文字化けしてしまっていたということです。
説明不足で申し訳御座いません。
詳しく書くと、今現段階では
MySQLに入っている日本語データを

cursor.execute(insert_stmt) res = cursor.fetchall() for q in res: res_cp932 = [k.encode('cp932') for k in q] fp = open('temp.csv', 'aw') w = csv.writer(fp,lineterminator='\n') w.writerow(res_cp932)

のようにして書いています。
これを、以前

a = [1,2,3]

などと結合して書こうとしたところ日本語の部分が書き込まれてはいるのですが、文字化けしてしまいました。
もしくはasciiコードエラーのようなものが出ました。
よろしくお願い致します。

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

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

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

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

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

Lhankor_Mhy

2016/10/28 04:14

日本語があってもaとbを結合してから問題なく書き込めました。『正しくエクセルファイルに書き込めなかった』時のコードをご提示いただけますか?
Lhankor_Mhy

2016/10/28 08:24

unicodeのまま放り込んだらダメなんでしょうか……
guest

回答1

0

CSVへ出力する処理自体はLhankor_Mhyさんが言うとおり問題なさそうですね。
恐らく(厄介な!)文字コード問題ではまってるように思います。
SQLから取り出した文字列の状態確認にtype()を使ってみると良いかもしれません。

python

1import csv 2 3a = "あいうえお" # Python上の文字列 4print(a,type(a)) # あいうえお <class 'str'> 5 6b = a.encode('cp932') # エンコードして「バイト列」に変換してます 7print(b,type(b)) # b'\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8' <class 'bytes'> 8 9c = b.decode("cp932") # デコードして「文字列」に戻してます 10print(c,type(c)) # あいうえお <class 'str'> 11 12fp = open('temp.csv', 'wt') 13w = csv.writer(fp, lineterminator='\n') 14w.writerow(b) # temp.csv / 130,160,130,162,130,164,130,166,130,168 / 文字化け! 15w.writerow(c) # temp.csv / あ,い,う,え,お 16 17fp.close()

type()でclass 'bytes'だった場合(バイト列の場合)はリストの結合は出来ないので、やっぱりエンコード絡みが怪しい・・・。
全然見当違いのこと言ってたら申し訳ないですが、お試しで[k.encode('cp932') for k in q]を[k.decode('cp932') for k in q]にしてみたらどうでしょう?

投稿2016/11/06 16:33

uni8inu

総合スコア127

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問