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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1616閲覧

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

essa

総合スコア81

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/11/15 01:24

編集2018/11/15 01:35

pandasでcsvファイルを読み込み、queryメソッドにて指定した条件を抽出しようとしたときに
「UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)」
というエラーがおきました。

プログラムは下記です。

python

1import pandas as pd 2import sys, codecs 3import dask.dataframe as ddf 4 5sys.stdout = codecs.getwriter('utf_8')(sys.stdout) 6sys.stdin = codecs.getreader('utf_8')(sys.stdin) 7 8hoge = ddf.read_csv(「ファイルネーム」,encoding='utf-8',engine='python') 9hoge_ex = hoge.query('2000<"年"<2005')

デフォルトエンコーディングはutf-8です

解決策をご存知のかたがいましたら、おしえていただけると幸いです。

#########################
下記追記情報

追記情報依頼ありがとうございます。
Pythonバージョン:Python3
CSVファイルのエンコーディング:UTF-8
TraceBack全文;

TraceBack

1Traceback (most recent call last): 2 File "csv_merge.py", line 16, in <module> 3 hoge_ex = hoge.query('2000<"年"<2005') 4 File "C:\user\Anaconda3\lib\site-packages\dask\dataframe\core.py", line 2367, in query 5 meta = self._meta.query(expr, **kwargs) 6 File "C:\user\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2116, in query 7 res = self.eval(expr, **kwargs) 8 File "C:\user\Anaconda3\lib\site-packages\pandas\core\frame.py", line 2186, in eval 9 return _eval(expr, inplace=inplace, **kwargs) 10 File "C:\user\Anaconda3\lib\site-packages\pandas\core\computation\eval.py", line 267, in eval 11 ret = eng_inst.evaluate() 12 File "C:\user\Anaconda3\lib\site-packages\pandas\core\computation\engines.py", line 72, in evaluate 13 self.result_type, self.aligned_axes = _align(self.expr.terms) 14 File "C:\user\Anaconda3\lib\site-packages\pandas\core\computation\align.py", line 135, in _align 15 return _result_type_many(*(term.value for term in terms)).type, None 16 File "C:\user\Anaconda3\lib\site-packages\pandas\core\computation\common.py", line 20, in _result_type_many 17 return reduce(np.result_type, arrays_and_dtypes) 18UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)

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

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

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

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

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

can110

2018/11/15 01:28

Pythonバージョン(2or3)、CSVファイルのエンコーディングを追記ください。また、エラーはTraceback全文を提示ください。
essa

2018/11/15 01:35

追記しました。よろしくお願いいたします。
can110

2018/11/15 01:45

追記ありがとうございます。別エラーは出ますが、提示エラーが再現できません。CSVファイルのBOMの有無(よく分からなければ、どんなソフトで保存したか)および可能でしたらCSVファイルの中身(どんな行や列があるか?)を提示ください。
essa

2018/11/15 01:51

nkf -guessにて確認した結果、UTF-8でした。念の為サクラエディタで開いて文字コードを確認しましたがUTF-8でした。CSVファイルの中身は文字列型、int型、float型が混在しており、MBサイズのファイルとなっています。そのため、pandasではなくdaskを使用しています。
can110

2018/11/15 01:56

BOM無ですね。了解です。CSVファイルの先頭数行だけでもコード表記(回答者がコピペで再現しやすい)で追記されると回答得られやすいかと思います。
hayataka2049

2018/11/15 03:15 編集

念の為、改めてpythonのバージョンを確認してみてください。質問文のプログラムを実行しているのと同じ方法で、import sys;print(sys.version);print(sys.prefix)を実行してみてください
essa

2018/11/16 07:01

hayataka2014様 返信ありがとうございます。別の方法で解決しました。
guest

回答1

0

ベストアンサー

直接の回答ではありませんが、今後エラー発生しそうなのでその部分の指摘のみ。

標準入出力のエンコードを切り替えていますが、Python2.x用の処理になっています。
Python3.x環境でprintするとType Errorが発生するはずです。
代わりにio.TextIOWrapperを使う必要があります。

参考:sys.stdout のエンコードを変更する in Python3.0

Python

1enc = 'utf-8' #他、cp932など 2 3#import sys, codecs 4#sys.stdout = codecs.getwriter(enc)(sys.stdout) 5#sys.stdin = codecs.getreader(enc)(sys.stdin) 6#print('あいう') # TypeError: write() argument must be str, not bytes 7 8import sys,io 9sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=enc) 10sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding=enc) 11print('あいう') # OK

エラー現象について追記

以下の通り、コード一部修正+当方のCSVデータでは正常動作しました。参考まで。
ポイントとしては、query文字列において、SQLとは異なり列名を"で囲ってはいけないことに注意です。

Python

1# 以下では標準入出力は利用しないので、切り替えは不要だが 2enc = 'utf-8' #他、cp932など 3import sys,io 4sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=enc) 5sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding=enc) 6 7import pandas as pd 8import dask.dataframe as ddf 9 10hoge = ddf.read_csv('inp.csv',encoding='utf-8',engine='python') 11hoge_ex = hoge.query('2000<年<2005') # 年は""で囲わない! 12 # UnicodeEncodeError('ascii', '年', 0, 1, 'ordinal not in range(128)')が発生 13hoge_ex.to_csv('./out-*.csv',encoding='utf-8')

inp.csv

PlainText

1名称,年,値 2あいう,2000,1.2 3かきく,2004,3.4 4さしす,2018,5.6

out-0.csv なぜか見出し先頭にカンマがついてしまう

PlainText

1,名称,年,値 21,かきく,2004,3.4

投稿2018/11/15 02:16

編集2018/11/15 03:00
can110

総合スコア38233

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

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

essa

2018/11/16 07:03

can110様 丁寧に回答していただき、ありがとうございます。 参考にさせていただきました。 また、pandasやdaskを使ってて思ったのですが、データの型式は統一していないと すぐにエラーが起きてしまうのですね。 しっかりと整ったデータでしたらpandas等で処理しやすいですが、そうでない場合は csvモジュールを使ったほうが使いやすいと感じました。 ベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問