使用Python在Excel(.xlsx)中查找和替换字符串
我试图替换.xlsx表中的一组字符串(~70k行,38列)。我有一个文件中要搜索和替换的字符串列表,格式如下:-使用Python在Excel(.xlsx)中查找和替换字符串,python,excel,replace,find,Python,Excel,Replace,Find,我试图替换.xlsx表中的一组字符串(~70k行,38列)。我有一个文件中要搜索和替换的字符串列表,格式如下:- bird produk - bird product pig - pork ayam - chicken ... kuda - horse 要搜索的单词在左侧,替换词在右侧(查找“bird produk”,替换为“bird product”)。My.xlsx工作表如下所示:- name type of animal ID ali pig
bird produk - bird product
pig - pork
ayam - chicken
...
kuda - horse
要搜索的单词在左侧,替换词在右侧(查找“bird produk”,替换为“bird product”)。My.xlsx工作表如下所示:-
name type of animal ID
ali pig 3483
abu kuda 3940
ahmad bird produk 0399
...
ahchong pig 2311
我正在寻找最快的解决方案,因为我的列表中有大约200个单词需要搜索,并且.xlsx文件相当大。我需要使用Python来实现这一点,但我愿意接受任何其他更快的解决方案
编辑:-添加了图纸示例
Edit2:-尝试了一些python代码来读取单元格,花费了相当长的时间来读取。有指针吗
from xlrd import open_workbook
wb = open_workbook('test.xlsx')
for s in wb.sheets():
print ('Sheet:',s.name)
for row in range(s.nrows):
values = []
for col in range(s.ncols):
print(s.cell(row,col).value)
谢谢大家!
Edit3:-我终于找到了答案。VBA模块和Python代码都可以工作。我使用.csv来简化工作。谢谢!这是我的Python代码版本:-
import csv
###### our dictionary with our key:values. ######
reps = {
'JUALAN (PRODUK SHJ)' : 'SALE( PRODUCT)',
'PAMERAN' : 'EXHIBITION',
'PEMBIAKAN' : 'BREEDING',
'UNGGAS' : 'POULTRY'}
def replace_all(text, dic):
for i, j in reps.items():
text = text.replace(i, j)
return text
with open('test.csv','r') as f:
text=f.read()
text=replace_all(text,reps)
with open('file2.csv','w') as w:
w.write(text)
制作2个数组
A[bird produk,pig,ayam,kuda]//要更改的单词
B[鸟制品、猪肉、鸡肉、马]//更改单词后的结果
现在检查excel的每一行,并将其与A的每个元素进行比较。如果我匹配,则将其替换为B的相应元素
比如说
//不是真正的代码,比如伪代码
for (i=1 to no. of rows.)
{
for(j=1 to 200)
{
if(contents of row[i] == A[j])
then contents of row[i]=B[j] ;
break;
}
}
为了加快速度,您必须在替换单词后立即停止当前迭代,并检查下一行。与@coder\u A的想法类似,但使用字典进行“翻译”对于您来说,其中键是原始单词,每个键的值是它转换成的值。要使用Python读写xls,请使用xlrd和xlwt,请参阅 一个简单的xlrd示例:
from xlrd import open_workbook
wb = open_workbook('simple.xls')
for s in wb.sheets():
print 'Sheet:',s.name
for row in range(s.nrows):
values = []
for col in range(s.ncols):
print(s.cell(row,col).value)
要替换目标文本,请使用dict
replace = {
'bird produk': 'bird product',
'pig': 'pork',
'ayam': 'chicken'
...
'kuda': 'horse'
}
当使用replace中的'text'检查成员身份时,Dict将为您提供O(1)
(大多数情况下,如果键没有碰撞)时间复杂性。没有比这更好的性能了
因为我不知道你的字符串串是什么样子,所以这个答案可能不准确或不完整。我会将你文本文件的内容复制到excel文件中的新工作表中,并将该工作表命名为“查找”然后使用“文本到列”从第一行开始获取新工作表前两列中的数据
将以下代码粘贴到Excel中的模块中并运行它:
Sub Replacer()
Dim w1 As Worksheet
Dim w2 As Worksheet
'The sheet with the words from the text file:
Set w1 = ThisWorkbook.Sheets("Lookup")
'The sheet with all of the data:
Set w2 = ThisWorkbook.Sheets("Data")
For i = 1 To w1.Range("A1").CurrentRegion.Rows.Count
w2.Cells.Replace What:=w1.Cells(i, 1), Replacement:=w1.Cells(i, 2), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next i
End Sub
这是一个关于访问电子表格中的内容的问题,还是一个如何处理您在那里找到的内容的问题?@Scott Hunter如何处理我在.xlsx工作表中的内容。我可以读取该文件,但我需要根据另一个单独文件中的列表进行字符串匹配,并用新的字符串替换.xlsx中的字符串。我添加了一个示例在我的问题中@laike9m@antsemot我明白了。然后,正如我的第一个代码片段所示,您只需要迭代所有单元格值。我用5行(38列)测试了代码,耗时太长(>5分钟)。这正常吗?请参阅我的文章(已编辑)。我刚刚尝试读取单元格,但花了一段时间,因此我猜测读取、查找和替换单元格需要更长的时间。我已将内容复制到新的工作表中,并使用文本到列来分隔数据。我正在运行代码。我刚运行完代码,似乎某些字符串没有正确替换。并且这里有一些甚至没有被替换。请提供建议。如果只是其中一些有问题,我猜文本到列没有正确完成,并且在查找中文本周围有额外的空格。好的,谢谢,我会查找。顺便说一句,如果我想搜索整个单元格(而不仅仅是字符串的一部分),我应该将LookAt:=xlPart更改为LookAt:=xlother,对吗?是的,但这会使空格的问题变得更糟。要消除空格,可以使用TRIM(…)
函数,然后复制和粘贴值。这应该是最简单的方法。