En ce qui concerne a previous question, j'essaye de faire des remplacements sur un certain nombre de grands fichiers CSV.Rechercher et remplacer dans les fichiers CSV avec Python
L'ordre (et le contenu) des colonnes changent entre les fichiers, mais pour chaque fichier, il y a environ 10 colonnes que je veux et que je peux identifier par les noms d'en-tête de colonne. J'ai aussi 1-2 dictionnaires pour chaque colonne que je veux. Donc, pour les colonnes que je veux, je veux utiliser seulement les dictionnaires corrects et je veux les implémenter séquentiellement.
Un exemple de la façon dont je l'ai essayé de résoudre ce:
# -*- coding: utf-8 -*-
import re
# imaginary csv file. pretend that we do not know the column order.
Header = [u'col1', u'col2']
Line1 = [u'A',u'X']
Line2 = [u'B',u'Y']
fileLines = [Line1,Line2]
# dicts to translate lines
D1a = {u'A':u'a'}
D1b = {u'B':u'b'}
D2 = {u'X':u'x',u'Y':u'y'}
# dict to correspond header names with the correct dictionary.
# i would like the dictionaries to be read sequentially in col1.
refD = {u'col1':[D1a,D1b],u'col2':[D2]}
# clunky replace function
def freplace(str, dict):
rc = re.compile('|'.join(re.escape(k) for k in dict))
def trans(m):
return dict[m.group(0)]
return rc.sub(trans, str)
# get correspondence between dictionary and column
C = []
for i in range(len(Header)):
if Header[i] in refD:
C.append([refD[Header[i]],i])
# loop through lines and make replacements
for line in fileLines:
for i in range(len(line)):
for j in range(len(C)):
if C[j][1] == i:
for dict in C[j][0]:
line[i] = freplace(line[i], dict)
Mon problème est que ce code est assez lent, et je ne peux pas comprendre comment l'accélérer. Je suis un débutant, et je suppose que ma fonction freplace
est en grande partie ce qui ralentit les choses, car il doit compiler pour chaque colonne dans chaque rangée. Je voudrais prendre la ligne rc = re.compile('|'.join(re.escape(k) for k in dict))
de cette fonction, mais je ne sais pas comment faire cela et encore préserver ce que le reste de mon code fait.
Donc, pour chaque colonne, il y a une regex unique dont vous avez besoin? Pourquoi ne pas simplement créer 10 regex, et pointer vers la droite, avec un décalage déterminé par la colonne que les en-têtes déterminent? De cette façon, c'est une compilation unique pour 10 colonnes, alors vous êtes prêt? (Je suis désolé, je ne connais pas Python du tout et je suppose que ce serait ma première supposition). – onaclov2000
@ onaclov2000: En effet, c'est ce que j'espérais faire, mais je ne suis pas sûr de savoir comment pointer vers la bonne regex. – rallen