2016-08-23 1 views
1

en utilisant python 3.5.2 sur windows (32), je suis en train de lire un fichier DBF qui me renvoie un OrderedDict.python Erreur de décodage Unicode lors de l'accès aux enregistrements de OrderedDict

from dbfread import DBF 
Table = DBF('FME.DBF') 
for record in Table: 
    print(record) 

Lorsque vous accédez au premier enregistrement tout est ok jusqu'à ce que j'atteins un dossier qui contient diacritiques:

Traceback (most recent call last): 
    File "getdbe.py", line 3, in <module> 
    for record in Table: 
    File "...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dbfread\dbf.py", line 311, in _iter_records 
    for field in self.fields] 
    File "...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dbfread\dbf.py", line 311, in <listcomp> 
    for field in self.fields] 
    File "...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dbfread\field_parser.py", line 75, in parse 
    return func(field, data) 
    File "...\AppData\Local\Programs\Python\Python35-32\lib\site-packages\dbfread\field_parser.py", line 83, in parseC 
    return decode_text(data.rstrip(b'\0 '), self.encoding) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x82 in position 11: ordinal not in range(128) 

Même si je n'imprime pas le disque que j'ai encore le problème.

Une idée?

+0

https://dbfread.readthedocs.io/en/latest/introduction.html#character-encodings, essayez de passer 'DBF (...)' le codage correct. –

+0

Etes-vous sûr que c'est l'encodage UTF-8? – Harrison

+0

@Harrison: J'en doute fortement, DBF n'est pas un format où je m'attendrais à voir des données codées en UTF-8. Où le PO mentionne-t-il même UTF-8? –

Répondre

0

dbfread Impossible de détecter le codage correct à partir de votre fichier DBF. De l'Character Encodings section of the documentation:

dbfread va essayer de détecter le codage de caractères (page de code) utilisé dans le fichier en regardant l'octet language_driver. Si cela échoue, il revient à ASCII. Vous pouvez remplacer cela en transmettant encoding='my-encoding'.

Emphasis mine.

Vous devrez transmettre un codage explicite; ce sera invariablement une page de code Windows. Jetez un oeil à la supported codecs in Python; vous devrez en utiliser un qui commence par cp ici. Si vous ne savez pas quelle page de code vous avez, vous devrez faire un peu de tâtonnement. Notez que certaines pages de code se chevauchent en caractères, donc même si une page de code semble produire des résultats lisibles, vous pouvez continuer à chercher et essayer différents enregistrements dans votre fichier de données pour voir ce qui convient le mieux.

+0

Voilà la bonne réponse. J'ai eu du mal à trouver le bon codage, donc j'ai regardé le premier diacritique rencontré, c'est-à-dire ** "é" ** et recherché quel codage correspond à ** x82 **, j'ai trouvé que cp850 (MS-DOS). –

+0

@SDufour: il y a [11 pages de code où 'é' est codé comme 0x82] (http://www.fileformat.info/info/unicode/char/e9/codepage_support.htm). Vous pourriez éventuellement réduire davantage cela avec plus de points de code. –

+0

Merci, je n'ai pas eu le temps de le regarder. –