Encuentra y reemplaza cadenas en Excel (.xlsx) usando Python

Estoy tratando de reemplazar un grupo de cadenas en una hoja .xlsx (~ 70k filas, 38 columnas). Tengo una lista de las cadenas que deben buscarse y reemplazarse en un archivo, con el siguiente formato:

bird produk - bird product pig - pork ayam - chicken ... kuda - horse 

La palabra que debe buscarse está a la izquierda, y el reemplazo está a la derecha (busque ‘bird produk’, reemplace con ‘bird product’. Mi hoja .xlsx se parece a esto: –

 name type of animal ID ali pig 3483 abu kuda 3940 ahmad bird produk 0399 ... ahchong pig 2311 

Estoy buscando la solución más rápida para esto, ya que tengo alrededor de 200 palabras en la lista para buscar, y el archivo .xlsx es bastante grande. Necesito usar Python para esto, pero estoy abierto a cualquier otra solución más rápida.

Edición: – ejemplo de hoja añadida

Edit2: – Intenté algunos códigos de Python para leer las celdas, tomó mucho tiempo para leer. Cualquier punteros?

 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) 

¡Gracias!

Edit3: – Finalmente lo descubrí. Tanto el módulo VBA como los códigos Python funcionan. Recurrí a .csv para hacer las cosas más fáciles. ¡Gracias! Aquí está mi versión del código de 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) 

Copiaría el contenido de su archivo de texto en una nueva hoja de trabajo en el archivo de Excel y nombraría esa hoja como “Buscar”. Luego use texto a columnas para obtener los datos de las dos primeras columnas de esta nueva hoja que comienzan en la primera fila.

Pegue el siguiente código en un módulo en Excel y ejecútelo:

 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 

Haga 2 matrices A [produk de aves, cerdo, ayam, kuda] // palabras para cambiar B [producto de aves, cerdo, pollo, caballo] // resultado después de cambiar la palabra

Ahora revisa cada fila de tu excel y compárala con cada elemento de A. Si i coincide, reemplázala con el elemento correspondiente de B.

por ejemplo // no es un código real como pseudocódigo

 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; } } 

Para hacerlo rápido, debe detener la iteración actual tan pronto como se sustituya la palabra y verifique la fila siguiente.

Una idea similar a la de @coder_A, pero use un diccionario para hacer la “traducción”, donde las claves son las palabras originales y el valor de cada clave es a lo que se traduce.

Para leer y escribir xls con Python, use xlrd y xlwt, vea http://www.python-excel.org/

Un ejemplo simple de 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) 

y para reemplazar texto de destino, use un dict

 replace = { 'bird produk': 'bird product', 'pig': 'pork', 'ayam': 'chicken' ... 'kuda': 'horse' } 

Dict le dará O(1) (la mayoría de las veces, si las claves no chocan) la complejidad del tiempo al verificar la membresía usando 'text' in replace . No hay manera de obtener un mejor rendimiento que eso.

Como no sé cómo se ve tu bunch of strings , esta respuesta puede ser inexacta o incompleta.