2017-09-25 2 views
0

Python 3.1.3 Ce dont j'ai besoin est de lire le dictionnaire du fichier cp1251 en utilisant ConfigParser. Mon exemple:Codages dans ConfigParser (Python)

config = configparser.ConfigParser() 
config.optionxform = str 
config.read("file.cfg") 
DataStrings = config.items("DATA") 
DataBase = dict() 
for Dstr in DataStrings: 
    str1 = Dstr[0] 
    str2 = Dstr[1] 
DataBase[str1] = str2 

Après que je suis en train de remplacer certains mots dans certains fichiers UTF-8 selon le dictionnaire. Mais parfois ça ne marche pas (par exemple, avec des symboles de "nouveau retour chariot-ligne"). Mon fichier en UTF-8 et le fichier de configuration (dictionnaire) en CP1251. On dirait que des problèmes, je dois décoder la configuration en UTF-8. J'ai tryed ceci:

str1 = Dstr[0].encode('cp1251').decode('utf-8-sig') 

Mais erreur "'utf8' codec can't decode byte 0xcf in position 0" est apparu. Si j'utilise .decode('','ignore') - je perds presque tout le fichier de configuration. Que dois-je faire?

+1

'config.read (" file.cfg ", encoding =" cp1251 ")' – Goyo

+0

Sonne bien, ne fonctionne pas. Déjà essayé. Depuis Python3.x, il n'y a pas d'attribut "encoding". L'encodage est hérité du paramètre par défaut .open(). –

+0

Qu'est-ce que les attributs ont à voir avec quoi que ce soit? 'ConfigParser.read' a un argument mot-clé 'encoding' au moins depuis [python 3.3] (https://docs.python.org/3.3/library/configparser.html#configparser.ConfigParser.read). J'espère que vous n'utilisez pas une version plus ancienne. – Goyo

Répondre

2

Python 3.1 est dans la version no-mans-land des versions Python. vous auriez idéalement mise à niveau vers Python 3.5, qui vous permettra de faire config.read("file.cfg", encoding="cp1251")

Si vous devez rester sur 3.1x, vous pouvez utiliser la méthode ConfigParser.readfp() pour lire à partir d'un fichier déjà ouvert en utilisant le codage correct:

import configparser 

config = configparser.ConfigParser() 
config.optionxform = str 
config_file = open("file.cfg", encoding="cp1251") 
config.readfp(config_file) 
+0

Merci beaucoup. Vraiment –