Varias cadenas de expresiones regulares reemplazan en un archivo de texto grande usando Python

0

Tengo un archivo de texto muy grande en el que quiero ejecutar el reemplazo de cadenas basado en múltiples expresiones regulares. Actualmente lo estoy haciendo usando la característica similar de Sublime. Sin embargo, en archivos de más de un GB, mi sistema se cuelga.

Actualmente estoy ejecutando algunos de los siguientes partidos en mi sublime

\\\n - Elimine toda la barra invertida seguida de nueva línea.

\n - Eliminar todas las nuevas líneas.

\=\\\" - Reemplazar todas las instancias de =\" con tan solo ="

En un caso, también quiero agrupar la coincidencia y usarla en el texto reemplazado.

Algunos expertos a mi alrededor sugirieron escribir un script de Python rápido para el mismo, y el rendimiento no será un problema.

Con mi conocimiento limitado de Python, probé algo de la siguiente manera:

import pandas as pd
import numpy as np

df = pd.read_csv('story_all.csv')

output = df.str.replace('\n', '')

output.to_csv(story_done.csv, sep='\n', encoding='utf-8')

Sin embargo, no está funcionando. Y creo que en algún lugar podría estar exagerando.


Nota: El hecho de que el archivo de texto sea CSV realmente no importa. Solo necesito ejecutar algunos reemplazos de cadena. La nueva línea requerida por CSV se conserva mientras está hecha.


El error que obtengo es el siguiente:

Traceback (most recent call last): File "replace.py", line 4, in df = pd.read_csv('story_all.csv') File "/Users/safwan/Envs/regex/lib/python2.7/site-packages/pandas/io/parsers.py", line 709, in parser_f return _read(filepath_or_buffer, kwds) File "/Users/safwan/Envs/regex/lib/python2.7/site-packages/pandas/io/parsers.py", line 455, in _read data = parser.read(nrows) File "/Users/safwan/Envs/regex/lib/python2.7/site-packages/pandas/io/parsers.py", line 1069, in read ret = self._engine.read(nrows) File "/Users/safwan/Envs/regex/lib/python2.7/site-packages/pandas/io/parsers.py", line 1839, in read data = self._reader.read(nrows) File "pandas/_libs/parsers.pyx", line 902, in pandas._libs.parsers.TextReader.read File "pandas/_libs/parsers.pyx", line 924, in pandas._libs.parsers.TextReader._read_low_memory File "pandas/_libs/parsers.pyx", line 978, in pandas._libs.parsers.TextReader._read_rows File "pandas/_libs/parsers.pyx", line 965, in pandas._libs.parsers.TextReader._tokenize_rows File "pandas/_libs/parsers.pyx", line 2208, in pandas._libs.parsers.raise_parser_error pandas.errors.ParserError: Error tokenizing data. C error: Expected 19 fields in line 8058, saw 65

Ejemplo de un valor de archivo CSV:

id,title,name_in_english,type,water_directory_term,org_work_area_term,org_type_term,defined_state,org_location_taluka_term,org_location_state_term,org_location_village_term,org_name_term,ha_free_term,org_location_dist_term,fax,samprak_bekti,email,phoneno,website/blog,postal_address,sangathan_ke_bare_main,rajya_state,taluka_sahar,jilla_district,kisi_prakar_kaa_sangathan,name,ID,created,status
"883","some title","","org","lorem","ipsum","lorem","","","very large body field","","","","","admin","1","1230273749","1"
"884","some title","","org","lorem","ipsum","lorem","","","very large body field","","","","","admin","1","1230273749","1"
"885","some title","","org","lorem","ipsum","lorem","","","very large body field","","","","","admin","1","1230273749","1"
"886","some title","","org","lorem","ipsum","lorem","","","very large body field","","","","","admin","1","1230273749","1"
  • 0
    Esto podría no ser un problema de expresiones regulares. Más bien, el recuento de campos para cada entrada de csv es claramente incorrecto. Proporcione algunas cadenas de entrada y salida esperadas. Además, sep='\n' parece extraño. – 
  • 0
    ¿Alguna de las cadenas que desea reemplazar abarca más de una línea? – 
Mostrar mas 1 comentario
Etiquetas de preguntas:
pandas
parsing
replace

2 respuestas

1
Mejor respuesta

Si entiendo correctamente, podría hacer lo siguiente.
Esto parece funcionar con la muestra de datos que compartió

import pandas as pd

df = pd.read_csv('story_all.csv', sep=',')

# Chars to replace
chars = [
    '\n',
]

output = df.replace(chars, '', regex=True)
output.to_csv('story_done.csv', sep=',', encoding='utf-8', index=False)
La respuesta fue
Fuente
  • 0
    ¿Regex match funcionará con esto? Por alguna razón, no puedo obtener una coincidencia para algún ejemplo que probé. – 
  • 0
    Lo sentimos, puede probar output = df.replace(chars, "", regex=True) – 
Mostrar mas 1 comentario
0

Finalmente pude hacer la tarea requerida sin la ayuda de los pandas. Si bien el enfoque lee todo el archivo en la memoria, funciona bastante bien para archivos de hasta 1-1.5 GB en mi MacBook Pro. Sirve para mi propósito. Encontré el código base para esto aquí .

# import the modules that we need. (re is for regex)
import os, re

# set the working directory for a shortcut
os.chdir('/Users/username/Code/python/regex')

# open the source file and read it
# fh = file('org.csv', 'r')
fh = file('story_all.csv', 'r')
thetext = fh.read()
fh.close()

# create the pattern object. Note the "r". In case you're unfamiliar with Python
# this is to set the string as raw so we don't have to escape our escape characters

#match all newline followed by backslash.
p1 = re.compile(r'\n\\')
# p2 = re.compile(r'\n')
#match all newline except the one followed by digits in quotes.
p2 = re.compile(r'\n+(?!\"\d+\")')
p3 = re.compile(r'\\N')
p4 = re.compile(r'\=\\\"')




# do the replace
result = p1.sub("", thetext)
result = p2.sub("", result)
result = p3.sub("", result)
result = p4.sub('="', result)

# write the file
f_out = file('done.csv', 'w')
f_out.write(result)
f_out.close()

Tarda alrededor de 30-40 segundos cuando se usa contra archivos cercanos a 1 GB.

La respuesta fue
Fuente
Comunidad Progexpertos
Arriba
Menu