web-dev-qa-db-ja.com

Python 3 UnicodeDecodeErrorを与えるCSVファイル: 'utf-8'コーデックは印刷時にバイトエラーをデコードできません

Python 3に次のコードがあります。これはcsvファイルの各行を印刷するためのものです。

import csv
with open('my_file.csv', 'r', newline='') as csvfile:
    lines = csv.reader(csvfile, delimiter = ',', quotechar = '|')
    for line in lines:
        print(' '.join(line))

しかし、実行すると、次のエラーが表示されます。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 7386: invalid start byte

Csvファイルを調べたところ、単一のñ(上にチルダが付いた小さなn)を取り出すと、すべての行が正常に出力されることがわかりました。

私の問題は、同様の問題に対する多くの異なる解決策を検討したことですが、まだこれを修正する方法、デコード/エンコードする方法などがわかりません。 。

22
HLH

エラーメッセージで言及されているため、ファイルにはバイトb'\x96'が含まれていることがわかります。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 7386: invalid start byte

これで、b'\x96'ñにデコードするエンコードが存在するかどうかを確認するための小さなスクリプトを作成できます。

import pkgutil
import encodings
import os

def all_encodings():
    modnames = set([modname for importer, modname, ispkg in pkgutil.walk_packages(
        path=[os.path.dirname(encodings.__file__)], prefix='')])
    aliases = set(encodings.aliases.aliases.values())
    return modnames.union(aliases)

text = b'\x96'
for enc in all_encodings():
    try:
        msg = text.decode(enc)
    except Exception:
        continue
    if msg == 'ñ':
        print('Decoding {t} with {enc} is {m}'.format(t=text, enc=enc, m=msg))

をもたらす

Decoding b'\x96' with mac_roman is ñ
Decoding b'\x96' with mac_farsi is ñ
Decoding b'\x96' with mac_croatian is ñ
Decoding b'\x96' with mac_arabic is ñ
Decoding b'\x96' with mac_romanian is ñ
Decoding b'\x96' with mac_iceland is ñ
Decoding b'\x96' with mac_turkish is ñ

したがって、変更してみてください

with open('my_file.csv', 'r', newline='') as csvfile:

次のようなエンコーディングのいずれか:

with open('my_file.csv', 'r', encoding='mac_roman', newline='') as csvfile:
47
unutbu

with open('my_file.csv', 'r', newline='', encoding='ISO-8859-1') as csvfile:

ñ文字はUTC-8エンコードにリストされていません。この問題を修正するには、代わりにISO-8859-1エンコードを使用できます。このエンコードの詳細については、以下のリンクを参照してください。 https://www.ic.unicamp.br/~stolfi/EXPORT/www/ISO-8859-1-Encoding.html

15
Sir Markpo

件名に示されているのと同じエラーが発生した他のユーザーについては、csvファイルのファイルエンコーディングに注意してください。 utf-8ではない可能性があります。 LibreOfficeが今日私にutf-16エンコードファイルを作成したことに気づいたのですが、これを再現することはできませんでした。

open(... encoding='utf-8')を使用してutf-16でエンコードされたドキュメントを開こうとすると、エラーが発生します。

UnicodeDecodeError: 'utf-8'コーデックは位置0のバイト0xffをデコードできません:無効な開始バイト

修正するには、「utf-16」エンコーディングを指定するか、csvのエンコーディングを変更します。

5

また、python 3の問題に直面しました。私の問題はtf-16としてエンコードタイプを使用して解決されました。

with open('data.csv', newline='',encoding='utf-16') as csvfile:
0
Sheshan Gamage