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

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

ただいまの
回答率

91.35%

  • Python

    3871questions

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

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

解決済

回答 2

投稿 2017/11/29 02:22

  • 評価
  • クリップ 0
  • VIEW 74

tools.i

score 2

前提・実現したいこと

市販の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) で終了しました。

該当のソースコード

import codecs
filelistname = "TEST_filelist.txt"

f_in = open(filelistname, 'r')

lines = f_in.readlines()

linelist = []

for line in lines:
    newline = line.rstrip('\n')
    if newline != '':
        linelist.append(newline)
        print(newline)

for l in linelist :
    f_data = codecs.open(l, 'r',encoding="Shift_JIS", errors = 'ignore')
    lines = f_data.readlines()
    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"

  3. 最終行に下記を追加した
    end = " "

補足情報(言語/FW/ツール等のバージョンなど)

Pythonは初心者です。
Anaconda 5.0.1
Visual Studio 2015, 2017ともに同じ表示です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • toris-birds

    2017/11/29 04:27 編集

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

    キャンセル

回答 2

checkベストアンサー

0

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

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

検証コード

# -*- coding: utf-8 -*-
import codecs
f_data = codecs.open('file1.txt', 'r',encoding="utf_16")
lines = f_data.readlines()
print(lines, end = " ") # ['E:\\Users\\A\r\n']
f_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 10:27

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/30 00:41 編集

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

    キャンセル

  • 2017/11/30 02:47

    open(file-name, 'r', encoding="utf-16")
    としたところ、読めるようになりました。
    どうもありがとうございました。

    表示していたのですが、「utf-8で読み込めませんでした」とメッセージが出るエディタがあることが分かりました。
    また、別のエディタでは
    USC-2 LE BOM
    というものでエンコードされていることが分かりました。

    キャンセル

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/29 04:02

編集 2017/11/30 03:15

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/30 02:39

    open(file-name, 'r', encoding="utf-16")
    としたところ、読めるようになりました。
    どうもありがとうございました。

    表示していたのですが、「utf-8で読み込めませんでした」とメッセージが出るエディタがあることが分かりました。
    また、別のエディタでは
    USC-2 LE BOM
    というものでエンコードされていることが分かりました。

    キャンセル

  • 2017/11/30 02:42

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

    キャンセル

  • 2017/11/30 03:14

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

    キャンセル

  • 2017/11/30 03:16

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

    キャンセル

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

ただいまの回答率

91.35%

関連した質問

同じタグがついた質問を見る

  • Python

    3871questions

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