В связи с предыдущим вопросом , я пытаюсь заменить несколько больших файлов CSV.
Порядок (и содержимое) столбцов изменяется между файлами, но для каждогоВ файле есть около 10 столбцов, которые я хочу и могу определить по именам заголовков столбцов.У меня также есть 1-2 словаря для каждой колонки, которую я хочу.Поэтому для столбцов, которые я хочу, я хочу использовать только правильные словари и хочу последовательно их реализовывать.
Пример того, как я пытался решить эту проблему:
# -*- 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)
МойПроблема в том, что этот код довольно медленный, и я не могу понять, как его ускорить. Я новичок , и я предположил, что моя freplace
функция во многом замедляет работу, потому что она должна компилироваться для каждого столбца в каждой строке.Я хотел бы убрать строку rc = re.compile('|'.join(re.escape(k) for k in dict))
из этой функции, но не знаю, как это сделать, и при этом сохранить то, что делает остальная часть моего кода.