[過去ログ] Pythonのお勉強 Part63 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
877
(3): デフォルトの名無しさん (ワッチョイ bf8c-th+2) [] 2020/09/04(金) 13:27:43.28 ID:gLEobkXD0(1/5) AAS
utf-8で書かれたファイルを標準入力にあたえてタブで区切ってリストにしたいんですが文字化けしてしまいます。
ステップバイステップで色々試していくとどうもリストに入れると化けるみたいなんですが、なんでですか??
↓最終的にこんなプログラムで文字化けする/しないの差が出ます。
# -*- coding: utf-8 -*-
import sys
# stdin = "住所CD 都道府県CD 市区町村CD 町域CD 郵便番号 事業所フラグ 廃止フラグ 都道府県 都道府県カナ 市区町村 市区町村カナ 町域 町域カナ 町域補足 京都通り名 字丁目 字丁目カナ 補足 事業所名 事業所名カナ 事業所住所 新住所CD"

a = input().encode('unicode-escape').decode('utf-8').split("\\t")
[print(x.encode().decode('unicode-escape')) for x in a] #化けない
print([x.encode().decode('unicode-escape') for x in a]) #化ける
880
(3): デフォルトの名無しさん (ワッチョイ bf8c-th+2) [] 2020/09/04(金) 14:42:48.83 ID:gLEobkXD0(2/5) AAS
>>878
その通りでした。OSはWin10で、pyは3.8.5です。
DOSプロンプトから実行していてcp=932です。でも、>result.txtみたいにして出力していてutf-8で出力されてます。
あと、元々はinput().split('\t')をしたかっただけなんですが、文字化けしてしまって色々と調べてました。
文字化けの具合は>>877に書いた化けっぷりと同じです。
s = input()
print(s) # 正常
print(s.split('\t')) #化ける
という感じです。
881: デフォルトの名無しさん (ワッチョイ bf8c-th+2) [] 2020/09/04(金) 14:51:51.80 ID:gLEobkXD0(3/5) AAS
>>879
__repr__というのがあるんですね。調べてみます
885: デフォルトの名無しさん (ワッチョイ bf8c-th+2) [] 2020/09/04(金) 15:30:13.83 ID:gLEobkXD0(4/5) AAS
>>880
>>882
そういうことか。わかりました。リストの中は化けてなんかないでし。forで中を覗くと正しかったです。つまり、listのtoStringまわりでおかしいということですね。
__str__なのか__repr__なのか、まだわかってませんが。でも、これがデフォルトの挙動だとすると使いづらくないんですか?
>>883
split("\\t")はunicode_escapeした状態でタブ区切りしたのでそうなってます。本来はsplit("\t")
889: デフォルトの名無しさん (ワッチョイ bf8c-th+2) [] 2020/09/04(金) 16:19:28.31 ID:gLEobkXD0(5/5) AAS
みなさんのコメントでそんなわけないと自分のコードを見直し
pythonのデフォルトがutf-8で、コマンドプロンプトのchcpを65001にすればいい、
という思い込みがありました。
print(sys.stdin.encoding)やprint(sys.stdout.encoding)をしたらcp932のままでした。
ので、
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
とすることで、全てがうまくいきました。

みなさん、ありがとうございました!
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.047s