【发布时间】:2011-04-25 10:48:06
【问题描述】:
与a previous question 相关,我正在尝试对一些大型 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)) 行,但不知道该怎么做,但仍然保留我的其余代码正在执行的操作。
【问题讨论】:
-
那么对于每一列,您需要一个唯一的正则表达式吗?为什么不只创建 10 个正则表达式,并指向正确的一个,偏移量由标题确定的列确定?这样,它是一次性编译 10 列然后你设置好了吗? (对不起,我根本不懂 Python,我想这将是我的第一个猜测)。
-
@onaclov2000:确实这是我希望做的,但我不知道如何指向正确的正则表达式。
标签: python performance function dictionary csv