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

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

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

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

Q&A

解決済

2回答

3648閲覧

pythonから日本語CSVが出力出来ない

obakemaru

総合スコア11

Python 3.x

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

0グッド

0クリップ

投稿2018/05/18 06:16

編集2018/05/18 08:28

お世話になります。

環境はwindows10 python3.6です。
下記のpyファイルを用いてコマンドプロンプト上で

test.py > result.csv
とし、csvを出力しています。

python

1import csv 2import os.path 3 4dirname = os.path.dirname(__file__) 5path = os.path.join(dirname,"test.csv") 6 7f = open(path, "r", encoding="utf-8") 8reader = csv.DictReader(f) 9for line in reader: 10 print(line["status"],",",line["user_id"]) 11f.close()

当コードは status も user_id も数字、英語の為問題無いのですが、
user_idやstatusが日本語になった場合に、
UnicodeEncodeError: 'cp932' codec can't encode character '\u5434' in position 0: illegal multibyte sequence
となり、出力する事が出来ません。

どの様にすれば日本語ファイルが出力出来る様になるかご教示頂きたく思います。

現在はVS codeにコードを書いて、右クリックプロンプトで実行をしています。

リダイレクトを利用しない方向で考えています。

辞書型で書き出しを行いたいです。

csvファイルは40程度の見出しで、数万行です。

userID_A.csv(userIDとAの情報の組み合わせ)

userID_B.csv(userIDとBの情報の組み合わせ)

userID_C.csv(userIDとCの情報の組み合わせ)で出力を行いたいです。

python

1import csv 2import os.path 3 4dirname = os.path.dirname(__file__) 5path = os.path.join(dirname,"test.csv") 6f = opne(path, "w", encoding="utf-8", newline="") 7 8fieldnames = ["status","日本語のデータ"] 9writer = csv.DictWriter(f, fieldnames=fieldnames) 10writer.writerrow({"status":std, "日本語のデータ":"日本語"}) 11f.close()

上記コードだと出来そうですが、行数が数万行ある為、不可能と考えました。
何かリダイレクトせずCSVに一気に書き出せる方法は無いでしょうか?

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

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

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

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

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

LouiS0616

2018/05/18 06:36

リダイレクトを利用しないという選択肢はアリでしょうか?
obakemaru

2018/05/18 06:55

そうですよね。きっとプロンプトでやっている事がおかしいのだとうすうす気づいていました。書き出し方法がわからなかったもので。。。調べてみます!
LouiS0616

2018/05/18 08:15

ひとつ確認しておきますが、日本語のデータが無い場合はリダイレクトで目的をすべて達成できたのでしょうか?
obakemaru

2018/05/18 08:47

はい。日本語の場合以外は目的を達成しています。
guest

回答2

0

リダイレクトを利用しない、簡単な方法を紹介しておきます。

まず、次のように呼び出すと仮定します。

python test.py result.csv

test.pyの頭の方で、標準出力を切り替えるようなコードを書いておきます。

Python

1import sys 2 3if len(sys.argv) > 1: 4 dst_filename = sys.argv[1] 5 sys.stdout = open(dst_filename, 'w', encoding='utf-8') 6 7...

これなら、ほとんど書き換えずに目的の処理が出来るはずです。
ファイルを指定しない場合、標準出力を利用するようにもできました。

ただし

test.pyという名前は、標準モジュールと被るので避けた方が良いです。

投稿2018/05/18 07:01

編集2018/05/18 07:24
LouiS0616

総合スコア35660

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

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

obakemaru

2018/05/18 08:14

ありがとうございます。上記コードをdirname = os.path.dirname(__file__)を上に追加して実行しました。問題無く走ったのですが、ファイルの出力が出来ていない状態です。プロンプト上は表示されている。
LouiS0616

2018/05/18 08:22

カレントディレクトリは確認されましたか?
guest

0

ベストアンサー

コマンドライン引数で受け取るところまではLouiS0616さんと一緒ですが、sys.stdoutを上書きするよりこっちの方法が恐らく良いです。

python

1import csv 2import os.path 3 4dirname = os.path.dirname(__file__) 5path = os.path.join(dirname,"test.csv") 6dst_filename = sys.argv[1] 7 8f_in = open(path, "r", encoding="utf-8") 9f_out = open(dst_filename, 'w', encoding='utf-8') 10reader = csv.DictReader(f_in) 11for line in reader: 12 print(line["status"],",",line["user_id"], file=f_out) 13f_in.close() 14f_out.close()

でも、そもそもこれよりこっちを使うべき。csv.writer.writerowでいけます。

Pythonでcsvファイルにデータを書き込みをする基本中の基本

python

1import csv 2import os.path 3 4dirname = os.path.dirname(__file__) 5path = os.path.join(dirname,"test.csv") 6dst_filename = sys.argv[1] 7 8f_in = open(path, "r", encoding="utf-8") 9f_out = open(dst_filename, 'w', encoding='utf-8', newline='') # can110様のご指摘をうけて改善 10reader = csv.DictReader(f_in) 11writer = csv.writer(f_out) 12for line in reader: 13 writer.writerow([line["status"], line["user_id"]]) 14f_in.close() 15f_out.close()

投稿2018/05/18 07:11

編集2018/05/18 09:49
hayataka2049

総合スコア30933

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

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

obakemaru

2018/05/18 08:08

ありがとうございます。 ただし上記のコードを実行するとIndexError: list index out of rangeとなる様です。
hayataka2049

2018/05/18 09:32 編集

・どっちのコードですか? ・あと、どこでそのエラーが出ますか? ・実行時のコマンドも教えてください 以上3点について教えてください
can110

2018/05/18 09:38

open(dst_filename, 'w', encoding='utf-8')にて「newline=''」を指定しないと、改行がだぶって出力されてしまう(行毎にCRCRLFが出力される)ようです。
hayataka2049

2018/05/18 09:50 編集

すみません、windows環境で確認していませんでした。csv.writerの方ですね。修正しました。ご指摘ありがとうございます
can110

2018/05/18 09:52

はい。Win10環境です。修正対応ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問