Python 使用xlrd/xlwt和循环迭代优化excel数据收集/缩减

Python 使用xlrd/xlwt和循环迭代优化excel数据收集/缩减,python,excel,optimization,nested-loops,Python,Excel,Optimization,Nested Loops,我最近刚开始用Python编写代码,还有很多东西要学习。我的代码的目标是从单元格中提取字符串,检查其字符长度,并用特定的缩写替换单词。然后,我将新字符串写入不同的excel工作表,并在所有数据减少后保存。我终于想出了如何让它工作,但它确实需要很长时间。我正在处理10000多个字符串单元格,我的循环迭代可能远未优化。如果你有任何有用的信息,那就太好了 import xlwt import xlrd book = xlrd.open_workbook() # opens excel file fo

我最近刚开始用Python编写代码,还有很多东西要学习。我的代码的目标是从单元格中提取字符串,检查其字符长度,并用特定的缩写替换单词。然后,我将新字符串写入不同的excel工作表,并在所有数据减少后保存。我终于想出了如何让它工作,但它确实需要很长时间。我正在处理10000多个字符串单元格,我的循环迭代可能远未优化。如果你有任何有用的信息,那就太好了

import xlwt
import xlrd

book = xlrd.open_workbook() # opens excel file for data input
reduc = xlwt.Workbook()     # creates the workbook that the reduced data will be saved in

# Calls the sheets I will be working with
Data = book.sheet_by_index(3)
Table = book.sheet_by_index(5)
sheet1 = reduc.add_sheet("sheet 1")

# the initial loop pulls the string from excel

for x in xrange(30): # I use a limited range for debugging
    From = str(Data.col(15)[x].value)
    To = str(Data.col(16)[x].value)
    print x # I just print this to let me know that i'm not stuck

    if len(From) <= 30 and len(To) <= 30:
        sheet1.write(x, 3, From)
        sheet1.write(x, 4, To)
    else:
        while len(From) > 30 or len(To) > 30:
            for y in xrange(Table.nrows):
                word = str(Table.col(0)[y].value)
                abbrv = str(Table.col(1)[y].value)
                if len(From) > 30:
                    From = From.replace(word, abbrv)
                if len (To) > 30:
                    To = To.replace(word, abbrv)
            sheet1.write(x, 3, From)
            sheet1.write(x, 4, To)
            break

reduc.save("newdoc.xls")
print " DONE! 
导入xlwt
导入xlrd
book=xlrd.open_工作簿()#打开excel文件进行数据输入
reduce=xlwt.Workbook()#创建将保存缩减数据的工作簿
#调用我将处理的工作表
数据=按索引(3)列出的账簿表
表=按索引(5)列出的帐簿表
表1=减少、添加表(“表1”)
#初始循环从excel中提取字符串
对于xrange(30)中的x:#我使用有限的范围进行调试
From=str(Data.col(15)[x].值)
To=str(Data.col(16)[x].值)
打印x#我打印这个只是为了让我知道我没有被卡住
如果len(From)30:
对于X范围内的y(表nrows):
word=str(表.列(0)[y].值)
abbrv=str(表.列(1)[y].值)
如果len(From)>30:
From=From.replace(单词,缩写)
如果len(To)>30:
To=To.replace(字,缩写)
活页1.书写(x,3,From)
活页1.书写(x,4,至)
打破
还原保存(“newdoc.xls”)
打印“完成!
下面是我的更新代码。这几乎是我所期望的。我预先加载了我想要的所有列,然后通过相同的循环系统运行。然后我将数据存储而不是写入新的excel文件。在所有数据减少后,我将每个单元格保存在单独的for循环中。谢谢大家的建议

import xlwt
import xlrd

# Workbook must be located in the Python27 folder in the C:/directory
book = xlrd.open_workbook() # opens exel file for data input

# Calls the sheets I will be working with
Data = book.sheet_by_index(0)
Table = book.sheet_by_index(1)

# Import column data from excel
From = Data.col_values(15)
To = Data.col_values(16)
word = Table.col_values(0)
abbrv = Table.col_values(1)

# Empty variables to be filled with reduced string
From_r = []
To_r = []

# Notes to be added 
for x in xrange(Data.nrows):
    if len(From[x]) <= 28 and len(To[x]) <= 28:
        From_r.append(From[x])
        To_r.append(To[x])
    else:
        while len(From[x]) > 28 or len(To[x]) > 28:
            for y in xrange(Table.nrows):
                if len(From[x]) > 28:
                    From[x] = From[x].replace(word[y], abbrv[y])
                if len (To[x]) > 28:
                    To[x] = To[x].replace(word[y], abbrv[y])
            From_r.append(From[x])
            To_r.append(To[x])
            break

# Create new excel file to write reduced strings into
reduc = xlwt.Workbook()
sheet1 = reduc.add_sheet("sheet 1")

# Itterate through list to write each object into excel
for i in xrange(Data.nrows):
    sheet1.write(i, 3, From_r[i])
    sheet1.write(i, 4, To_r[i])

# Save reduced string in new excel file
reduc.save("lucky.xls")
print " DONE! "
导入xlwt
导入xlrd
#工作簿必须位于C://目录下的Python27文件夹中
book=xlrd.open_工作簿()#打开exel文件进行数据输入
#调用我将处理的工作表
数据=按索引(0)列出的账簿表
表=按索引(1)列出的帐簿表
#从excel导入列数据
From=数据。列值(15)
To=数据列值(16)
word=表格列值(0)
abbrv=表中列值(1)
#要用缩减字符串填充的空变量
From_r=[]
To_r=[]
#要添加的注释
对于x范围内的x(Data.nrows):
如果len(从[x])28:
对于X范围内的y(表nrows):
如果len(从[x])>28:
From[x]=From[x]。替换(单词[y],缩写[y])
如果len(至[x])>28:
To[x]=To[x]。替换(单词[y],缩写[y])
From_r.append(From[x])
附加到(到[x])
打破
#创建新的excel文件以将减少的字符串写入
reduce=xlwt.Workbook()
表1=减少、添加表(“表1”)
#通过列表将每个对象写入excel
对于x范围内的i(Data.nrows):
活页1.书写(i,3,来源于[i])
表1.书写(i,4,To_r[i])
#将减少的字符串保存在新的excel文件中
还原保存(“lucky.xls”)
打印“完成!"

速度缓慢可能是因为更换代码效率低下。 您应该尝试加载所有单词和相应的缩写,除非列表太大以至于内存不足。 然后,为了更快,你可以一次替换所有单词

执行此操作并将其移出循环

words = [str(cell.value) for cell in Table.col(0)] #list comprehension
abbr = [str(cell.value) for cell in Table.col(1)]
replacements = zip(words, abbr)
此函数使用正则表达式模块替换给定列表中的所有匹配项

import re
def multiple_replacer(*key_values):
    replace_dict = dict(key_values)
    replacement_function = lambda match: replace_dict[match.group(0)]
    pattern = re.compile("|".join([re.escape(k) for k, v in key_values]))
    return lambda string: pattern.sub(replacement_function, string)
要使用它,请执行以下操作:

replaceFunc = multiple_replacer(*replacements) #constructs the function. Do this outside the loop, after the replacements have been gathered.
myString = replaceFunc(myString) 

速度慢可能是因为替换代码效率低。 您应该尝试加载所有单词和相应的缩写,除非列表太大以至于内存不足。 然后,为了更快,你可以一次替换所有单词

执行此操作并将其移出循环

words = [str(cell.value) for cell in Table.col(0)] #list comprehension
abbr = [str(cell.value) for cell in Table.col(1)]
replacements = zip(words, abbr)
此函数使用正则表达式模块替换给定列表中的所有匹配项

import re
def multiple_replacer(*key_values):
    replace_dict = dict(key_values)
    replacement_function = lambda match: replace_dict[match.group(0)]
    pattern = re.compile("|".join([re.escape(k) for k, v in key_values]))
    return lambda string: pattern.sub(replacement_function, string)
要使用它,请执行以下操作:

replaceFunc = multiple_replacer(*replacements) #constructs the function. Do this outside the loop, after the replacements have been gathered.
myString = replaceFunc(myString) 

感谢您的输入,我将加载所有单词和缩写。对所有匹配项进行替换的唯一问题是,我只是尝试将字符串设置为特定长度。字符串将用于索引系统,我希望在仍然适合特定框的情况下,它同样易于阅读。您可以使用不同的方法,如spli从左到右或从右到左替换字符串,直到总长度足够短,但这可能比正则表达式的答案要慢。我个人认为这已经足够好了,因为你仍然不会有使这如此耗时的双嵌套,成千上万的真的不是那么多,但是哟你得试试看。如果这听起来像是你想测试的东西,我可以添加一个显示细节的答案。谢谢你的输入,我将加载所有单词和缩写。替换所有匹配项的唯一问题是我只是尝试将字符串设置为特定长度。这些字符串将用于索引系统和我希望它在仍然适合于特定框的情况下同样易于阅读。您可以使用不同的方法,例如从左到右或从右到左替换术语,直到总长度足够短,但它可能比正则表达式的答案慢。我个人认为这足够好,因为您仍然不会有双重嵌套,这使它如此耗时,成千上万真的不是那么多,但你必须尝试一下,看看。如果这听起来像你想测试的东西,我可以添加一个答案显示细节。