2017-01-06 1 views
1

何が起こっているのかわかりません。私は、CSVファイルのデータをkmlファイルに変更するもの、csvファイルの複数のデータエントリを削除するものなど、いくつかのPythonプログラムを持っています。昨日不思議なことに誤って起動しました。utf8エラーコード、別名、奇妙なことにアジアの記号に変更されました

私はLinux Mint 17.3を使用しています。これは、同様の状況が発生してから1〜1.5週間後に再インストールされました。私がやる前に、Linuxを再フォーマットして再インストールするいくつかの理由がありました。今回は他の理由のどれもありませんが、この問題は再びうんざりしてしまい、今は何もできません。

昨日の午後には、プログラム内のファイル名を変更するだけで、コード内のその他のものは変更されませんでした。それはうまく動作していましたが、昨日の午後から夕方にかけて私はエラーコードを取得していましたが、実際のエラーコードが今だったのを覚えていないのですが、それはかなり奇妙なことでした。

今朝、この大規模なプロジェクトのさまざまな部分に取り掛かり、突然私はcsvファイルを取り込み、kmlファイルに目印を付けるように変換していました。

UTF-8コーデックは位置0でバイト0xffのをデコードすることはできません:私は、エラーコードを取得したこの時期、無効なスタートバイト

は、私は非常にすぐに非常に悪化し、完全に困惑していました。

私はそれを脇に置き、オンラインになる機会を得るまで待ってから10~15分後に決めました。代わりに私はいくつかのcsvファイルを結合し、複数のエントリを削除しようとしました。最初のCSVファイルを開くと、Libre Officeの起動画面が表示され、見たいはずの普通の英語ではなく、中国語/日本語/韓国語/その他のファイルが画面に表示されます。私がtxtファイルにcsvファイルを変更すると、正常に表示され、正常に表示されます。私はこの問題を抱えています。小さなcsvファイルは正常に開きますが、サイズに関係なく、正常に開くことはできません。まったく開きません。

私は本当に何が起こっているのか分かりませんが、これは過去2週間で2回目です。この問題を解決するにはどうすればいいですか?私はこの質問をどこに投稿すべきかは本当に分からない。

はい、開こうとしているファイルは、この時点で昨日開かれていて、使用しようとしていたプログラムはうまくいきました。

+0

もう少し調査するために、これらの乱雑なファイルの1つをアップロードできますか? – Hackerman

+0

ファイルをアップロードする方法がわかりません。私は真剣にファイルが問題ではないと思っています。数週間後に触れていないファイルは、Libre Office Calcですぐには上手くいかず、うまくいきました。今、彼らはアジアの文章のように見えます。それはutf8ファイルが壊れているように見えるようにほとんど動作しますが、それはLibre OfficeとPythonの両方に影響するため、私が考えることができるのは唯一のことです。 – confused

+0

おそらくあなたのマシンにロケールが壊れている可能性があります。 – MattDMo

答えて

1

ファイルがutf-16のエンコードで保存されているように見えますが、そのファイルがutf-8としてエンコードされているかのように読み込もうとしています。

バイト0xff0xfeはリトルエンディアンutf-16byte order mark、またはBOMあり、ファイルのエンコード方法をプログラムに伝えるいくつかのテキストファイルの先頭にバイト。

>>> s = u'abc' 
>>> s16 = s.encode('utf-16') 
>>> s16 
b'\xff\xfea\x00b\x00c\x00' 
>>> s16.decode('utf-8') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 

だからあなたは、ファイルを読み込むデコードしてから再保存することで、あなたのデータを回復しようとすることができます:

>>> with open('s16.txt', 'rb') as f: 
...  encoded = f.read() 
...  with open('new-file.txt', 'w') as outfile: 
...   outfile.write(encoded.decode('utf-16')) 
... 
3 
>>> with open('new-file.txt') as f: 
...  f.read() 
... 
'abc' 

私はファイル名と異なるへの保存、またはあなたの破損したファイルをバックアップすることをお勧めしたいですこれを行う前に、それがうまくいかない場合は、あなたの現在の状態に戻ることができます。

この方法でデータが修正された場合、破損の原因となった問題が残ります。場合によっては、アプリケーションやプロセスによっては、これらのファイルをutf-16として(再)書き込んでいる可能性があります。最後に修正した時刻をチェックして、変更内容と一致するかどうか確認してください。 @MattDMoが示唆しているように、あなたのロケールの設定はある時点で乱れているかもしれません。

関連する問題