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

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

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

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

Q&A

解決済

2回答

1188閲覧

Python3, visual studio 2015 または2017、読み込んだ日本語ファイルが文字化けする。

tools.i

総合スコア11

Python

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

0グッド

0クリップ

投稿2017/11/28 17:22

###前提・実現したいこと
市販のWindows アプリケーションで作成されたテキストファイルを読み込んでからそのファイルの行を表示すると文字化けしているので、直したい。
日本語ファイルの中身を表示する部分で、
['E\x00:\x00\x00 .... と表示されます。

Python3は日本語も適切にエンコードするみたいな記事を見かけるので、こんな簡単なこともできないのかと絶望的な気分です。

###発生している問題・エラーメッセージ

file1.txt file2.txt file3.txt ['E\x00:\x00\\x00U\x00s\x00e\x00r\x00s\x00\\x00A ........ プログラム '[9112] python.exe' はコード -1073741510 (0xc000013a) で終了しました。

###該当のソースコード

Python3

1 2import codecs 3filelistname = "TEST_filelist.txt" 4 5f_in = open(filelistname, 'r') 6 7lines = f_in.readlines() 8 9linelist = [] 10 11for line in lines: 12 newline = line.rstrip('\n') 13 if newline != '': 14 linelist.append(newline) 15 print(newline) 16 17for l in linelist : 18 f_data = codecs.open(l, 'r',encoding="Shift_JIS", errors = 'ignore') 19 lines = f_data.readlines() 20 print(lines, end = " ")

###試したこと
1.1行目に下記の行を追加してみた。(追加しなくても同じで、utf-8にしても同じ)

-- coding:shift-jis --

  1. codecs.open(...)を使った(使わなくても同じ)

  2. encoding をいくつか試した

encoding="Shift_JIS"
encoding="shift-jis"
encoding="UTF_8"
encoding="utf-8"

  1. 最終行に下記を追加した

end = " "

###補足情報(言語/FW/ツール等のバージョンなど)
Pythonは初心者です。
Anaconda 5.0.1
Visual Studio 2015, 2017ともに同じ表示です。

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

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

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

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

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

toris-birds

2017/11/28 19:27 編集

質問に、テキストエディタで表示されるエンコーディングの情報か、バイナリエディタでテキストを開いた時の表示を追加した方がよいかと思います。(エラーメッセージはPythonの内部で使っているunicodeのようですので)
guest

回答2

0

ベストアンサー

提示された出力結果からutf_16またはutf_16_beで開けると思われます。
が、念のため入力ファイルのエンコーディングを確認ください。
ちなみにerrors='ignore'をつけると原因が分かりにくくなるのでつけないほうがよいです。

また -*- coding:~ -*-は、ソースファイルがどの文字コードで書かれているかを指定するものです。
今回の問題とは直接の関係はありません。
保存されたソースファイルのエンコーディングを確認し、適切に指定してください。
(たしかVisualStudioではデフォルトでshift_jisで保存されたと思いますが)

検証コード

Python

1# -*- coding: utf-8 -*- 2import codecs 3f_data = codecs.open('file1.txt', 'r',encoding="utf_16") 4lines = f_data.readlines() 5print(lines, end = " ") # ['E:\Users\A\r\n'] 6f_data.close()

file1.txtの内容
先頭BOM(ff fe)付き

ff fe 45 00 3a 00 5c 00 55 00 73 00 65 00 72 00 ..E.:..U.s.e.r. 73 00 5c 00 41 00 0d 00 0a 00 s..A.....

投稿2017/11/29 01:27

can110

総合スコア38266

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

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

toris-birds

2017/11/29 15:41 編集

おそらく、提示された出力結果はファイル自体のエンコードを示すものではないと思います。(表示自体はpythonの内部形式の、utf16の類ではあるとは思いますが・・)
tools.i

2017/11/29 17:47

open(file-name, 'r', encoding="utf-16") としたところ、読めるようになりました。 どうもありがとうございました。 表示していたのですが、「utf-8で読み込めませんでした」とメッセージが出るエディタがあることが分かりました。 また、別のエディタでは USC-2 LE BOM というものでエンコードされていることが分かりました。
guest

0

テキストエディタで開いた際、多くの場合、エンコーディングが表示されるので、それを参考にするとよいかと思います。(エンコーディングの扱いに慣れている場合は、バイナリエディタで見た方が原因がはっきり分かりますが・・)
※BOM無しの場合は、ファイルの先頭付近に日本語などが含まれていない場合、ASCII、Shift-JIS、Utf-8等の判定材料が無いので、エンコーディングの判定で失敗する場合もあります。

今回の質問の場合、ファイルを開くf_in = open(filelistname, 'r')の段階でエンコードに配慮する必要があるかと思います。

似たようなサンプルが、Stackoverflowなどにありますので、参考にされるとよいかと思います。
Stackoverflow - Character reading from file in Python
Qiita - pythonでUTF8のテキスト処理

例: utf-8の場合
f_in = codecs.open(filelistname, 'r', encoding='utf-8')
(modeのデフォルトは'r'ですが、説明のために足しておきました)


1行目の -*- coding:shift-jis -*-は、プログラムのソースファイルのエンコードがShiftJISの場合の設定です。


linelist が既に文字化けしていると思いますので、linelistに対してcodecs.open(...)やなどを試した場合も、結果は変わらないと思います。

参考になれば。


追記:
BOM (バイトオーダーマーク)というのは、エンコーディングなどを示すためにファイル先頭に付けるマークで、その並び順でLE (リトルエンディアン)か、BE (ビッグエンディアン)かの判定にも使われます。

問題は、BOMが付いていない場合で、この場合はファイルの先頭付近の内容から、エンコーディングが推測されます。
大雑把に分類すると、
英字が1バイト:ASCII、shift-jis、utf-8など
英字が2バイト:utf-16など
※utf-16などの場合、バイナリエディタなどで見ると、アルファベットの間に0x00が挟まっているかと思います。

0x00~0x7fしか存在しない:ASCII (または shift-jis)
0x81など、0x00~0x7f以外の値が含まれる:shift-jis、utf-8など
※shift-jisの場合は、日本語を2バイトで表す場合の1バイト目など
詳細は文字コード表を参考にするとよいかと思います。

参考:
UCS-2 および UCS-2 とユニコードの関係 https://www.ibm.com/support/knowledgecenter/ja/ssw_i5_54/nls/rbagsucs2.htm

Unicode対応 文字コード表 (と解説) http://ash.jp/code/unitbl21.htm

投稿2017/11/28 19:02

編集2017/11/29 18:15
toris-birds

総合スコア122

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

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

tools.i

2017/11/29 17:39

open(file-name, 'r', encoding="utf-16") としたところ、読めるようになりました。 どうもありがとうございました。 表示していたのですが、「utf-8で読み込めませんでした」とメッセージが出るエディタがあることが分かりました。 また、別のエディタでは USC-2 LE BOM というものでエンコードされていることが分かりました。
tools.i

2017/11/29 17:42

なお、別のパソコンではencoding="utf-8"で読めました. ちょっとこの辺も謎ですが、とりあえず解決ということにしておきます。
toris-birds

2017/11/29 18:14

@tools.i エディタは、ShiftJISやutf-8に対応している事が多いですが、utf-16などに対応していないものもあります。その場合に「utf-8で読み込めませんでした」と表示されるのだと思います。また、ucs-2と表示される場合は、utf-16のようなものと思ってよいと思います。
tools.i

2017/11/29 18:16

分かりました。 どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問