J'ai besoin d'aide pour l'un de mes projets. Je nettoie un grand ensemble de données à insérer en masse dans Microsoft SQL. Les données sont comme 10 millions de lignes. Mais j'ai créé un script juste pour extraire les 1000 premiers pour le nettoyage en supposant que le reste est le même. J'ai remarqué qu'il y avait beaucoup de caractères UTF-8, alors je l'ai converti en caractère réel le plus proche. Mais après l'avoir extrait pour afficher les 100 000 premières lignes, j'ai remarqué qu'il y avait beaucoup plus de conversions UTF-8 à faire et je les convertis manuellement, ce qui est assez exhaustif. Je me demandais s'il y avait un moyen plus facile de le faire plutôt que de tout saisir manuellement. Voici mon code:

import re


infile = r"C:\\Users\\Dave\\Desktop\\database\\page-links_en.txt"
outfile = r"C:\\Users\\Dave\\Desktop\\database\\Complete\\cleanedpagelinks_file.txt"

fin = open(infile)
fout = open(outfile, "w+")


rex = re.compile(r'/([^/>]+)>')


for line in fin:
#for word in delete_list:
#    line = line.replace(word, "")
line = line.replace("%C3%A9","e")
line = line.replace("%C3%B3","o")
line = line.replace("%E2%80%93","-")
line = line.replace("%C3%A6","e")
line = line.replace("%C3%A8","e")
line = line.replace("_"," ")
line = line.replace("%C3%A0","e")
line = line.replace("%C3%A1","i")
line = line.replace("%C5%82","l")
line = line.replace("%C5%84","n")
line = line.replace("%C3%BF", "y")
line = line.replace("%C3%BE", "p")
line = line.replace("%C3%BD", "y")
line = line.replace("%C3%BC", "u")
line = line.replace("%C3%BB", "u")
line = line.replace("%C3%BA", "u")
line = line.replace("%C3%B9", "o")
line = line.replace("%C3%B6", "o")
line = line.replace("%C3%B5", "o")
line = line.replace("%C3%B4", "o")
line = line.replace("%C3%B3", "o")
line = line.replace("%C3%B2", "o")
line = line.replace("%C3%B1", "n")
line = line.replace("%C3%B0", "e")
line = line.replace("%C3%AC", "i")
line = line.replace("%C3%AD", "i")
line = line.replace("%C3%AE", "i")
line = line.replace("%C3%AF", "i")
line = line.replace("%C3%81","A")
line = line.replace("%C3%82","A")
line = line.replace("%C3%83","A")
line = line.replace("%C3%84","A")
line = line.replace("%C3%85","A")
line = line.replace("%C3%86","AE")
line = line.replace("%C3%87","C")
line = line.replace("%C3%88","E")
line = line.replace("%C3%89","E")
line = line.replace("%C3%8A","E")
line = line.replace("%C3%8B","E")
line = line.replace("%C3%8C","I")
line = line.replace("%C3%8D","I")
line = line.replace("%C3%8E","I")
line = line.replace("%C3%8F","I")
line = line.replace("%C3%90","D")
line = line.replace("%C3%91","N")
line = line.replace("%C3%92","O")
line = line.replace("%C3%93","O")
line = line.replace("%C3%94","O")
line = line.replace("%C3%95","O")
line = line.replace("%C3%96","O")
line = line.replace("%C3%98","O")
line = line.replace("%C3%99","U")
line = line.replace("%C3%9A","U")
line = line.replace("%C3%9B","U")
line = line.replace("%C3%9C","U")
line = line.replace("%C3%9D","Y")
line = line.replace("%C3%9F","B")
line = line.replace("%C3%a0","a")
line = line.replace("%C3%a1","a")
line = line.replace("%C3%a2","a")
line = line.replace("%C3%a3","a")
line = line.replace("%C3%a4","a")
line = line.replace("%C3%a5","a")
line = line.replace("%C3%a6","ae")
line = line.replace("%C3%a7","c")
line = line.replace("%C3%a8","e")
line = line.replace("%C3%a9","e")
line = line.replace("%C3%aa","e")
line = line.replace("%C3%ab","e")







match = rex.search(line)
if match:
    newline = match.group(1)
else: newline = ''
fout.write(newline + '\n')
fin.close()
fout.close()

Comme vous pouvez le voir dans mon code, je remplace manuellement la valeur réelle du caractère. Voici un exemple de ligne dans mon fichier texte que j'ai réalisé doit être converti.

B% E1% BA% A3o% C4% 90% E1% BA% A1i

2
DavidA 5 mars 2016 à 21:22

4 réponses

Meilleure réponse

Merci à tous, j'ai fini par le faire fonctionner. J'ai dû installer le module unidecode, ce qui m'a pris une éternité à comprendre car je rencontrais des erreurs d'invite pip et cmd. Après l'installation du package, j'ai ajouté cette ligne et cela a fonctionné.

line = cleanup(line)
line = unidecode(line)

J'apprécie vraiment l'aide!

0
DavidA 5 mars 2016 à 21:31

Pour autant que je sache, il s'agit d'un URL codé, c'est-à-dire d'encodage des caractères afin que vous puissiez passer en paramètre au serveur.

Utilisez unquote_plus() depuis urllib:

s1 = u'B%E1%BA%A3o %E1%BA%A1i'
print urllib.unquote_plus(s1)

Production:

Bảo ại
-1
dur 5 mars 2016 à 20:19

Vous pouvez utiliser urllib.parse.unquote. Il suppose UTF-8 par défaut, mais au cas où il y aurait également des URL d'autres codecs, vous pouvez utiliser une détection automatique:

from urllib.parse import unquote

def cleanup(url):
    try:
        return unquote(url, errors='strict')
    except UnicodeDecodeError:
        return unquote(url, encoding='latin-1')

Et B%E1%BA%A3o %C4%90%E1%BA%A1i était le dernier empereur du Vietnam:

>>> cleanup('B%E1%BA%A3o %C4%90%E1%BA%A1i')
'Bảo Đại'

Si vous souhaitez les convertir en équivalents ASCII, vous pouvez utiliser le unidecode:

>>> unidecode.unidecode('Bảo Đại')
'Bao Dai'
1
Antti Haapala 5 mars 2016 à 19:44

Vous pouvez utiliser unidecode avec urllib.parse.unquote:

In [8]: from unidecode import  unidecode

In [9]: from urllib.parse import unquote

In [10]: unidecode(unquote("Gotterd%C3%A4mmerung"))
Out[10]: 'Gotterdammerung'

unidecode convertira les caractères non ascii en leur équivalent ascii.

1
Padraic Cunningham 5 mars 2016 à 19:43