es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Limpiando archivo de texto de números para crear CSV

Así que estoy trabajando en un proyecto donde estoy convirtiendo archivos PDF a un archivo .txt, que estoy convirtiendo a un archivo CSV utilizando Python. Entonces, estoy trabajando con este PDF: https://secure.in.gov/dcs/files/AssessmentDecisions201301.pdf y convirtiéndolo a un archivo de texto utilizando un convertidor OCR en línea.
Aquí hay un fragmento de cómo se ve la información:

                               Abuso Sexual   Abuso Físico   Negligencia



               Ubicación/ 

    Región          Total         Su     No Su   Su    No Su   Su    No Su





  Estatal         Total         250     1143    185    1882    1409   7280

Luego, lo que quiero hacer es convertirlo en un archivo CSV legible que se pueda utilizar para el análisis de datos.
Entonces, para leer mi archivo, este es el código que tengo:

nombre_archivo = "AssessmentDecisions2013-01.txt"
archivo = open(nombre_archivo, 'rt')
informacion = archivo.read()
archivo.close()
nuevo = informacion.split()

La razón por la que lo estoy dividiendo es porque la primera columna de los datos tiene todos los números que necesito, pero están separados por tabulaciones, así que estoy intentando separarlos en sus propias columnas. Sin embargo, al intentar dividir el archivo, este es el resultado que obtengo al usar print(nuevo):

['\xff\xfe', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00']

Soy relativamente nuevo en la programación, así que no estoy seguro de cómo solucionar esto, pero básicamente solo estoy tratando de separar los diferentes números del informe en sus propias columnas.

Quiero que el archivo CSV ideal se vea así:

región condado asaltosub asaltosno su
Estatal Total 250 1143
asaultsub asaultno su negligenciasub negligenciano su
185 1882 1409 7280

Si alguien tiene algún consejo o sugerencia, ¡lo agradecería mucho! ¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Posible solución

    Parece que el problema con la división del archivo está relacionado con la codificación del archivo de texto. Dado que mencionaste el uso de un convertidor OCR en línea, es posible que el archivo de texto resultante tenga una codificación diferente a la esperada por Python.

    Una posible solución sería especificar la codificación al abrir el archivo. Por ejemplo, si el archivo de texto está codificado en UTF-8, puedes modificar tu código de la siguiente manera:

    nombre_archivo = "AssessmentDecisions2013-01.txt"
    with open(nombre_archivo, 'rt', encoding='utf-8') as archivo:
        informacion = archivo.read()
    nuevo = informacion.split()
    

    Esto te dará una lista de cadenas que puedes procesar más adelante para crear el archivo CSV deseado.

    En cuanto a la creación del archivo CSV, una forma de abordarlo sería recorrer la lista de cadenas y extraer los datos relevantes para almacenarlos en un diccionario. Una vez que hayas recopilado todos los datos para una fila en particular, puedes agregar el diccionario a una lista de diccionarios. Por último, puedes usar el módulo csv para escribir la lista de diccionarios en un archivo CSV. Aquí tienes un ejemplo de implementación:

    import csv
    
    # Suponiendo que la primera fila del archivo de texto contiene los encabezados
    encabezados = nuevo[0].split('\t')
    
    # Inicializando variables para almacenar los datos
    datos = []
    fila_actual = {}
    region_actual = ""
    
    # Recorriendo el resto de las filas
    for fila_cadena in nuevo[1:]:
        # Dividiendo la fila por tabuladores
        partes_fila = fila_cadena.split('\t')
        # Extrayendo la primera columna, que contiene el nombre de la región o condado
        primer_col = partes_fila[0]
        if primer_col != "":
            # Esta es una nueva región o condado, así que comenzamos una nueva fila
            region_actual = primer_col
            fila_actual = {"region": region_actual}
            datos.append(fila_actual)
        else:
            # Esta fila pertenece a la región o condado actual
            for i, col in enumerate(partes_fila[1:]):
                # Pasamos por alto la primera columna, que ya hemos extraído
                encabezado_actual = encabezados[i+1]
                fila_actual[encabezado_actual] = int(col)
    
    # Escribiendo los datos en un archivo CSV
    with open('AssessmentDecisions2013-01.csv', mode='w', newline='') as archivo_csv:
        escritor = csv.DictWriter(archivo_csv, fieldnames=encabezados)
        escritor.writeheader()
        for fila in datos:
            escritor.writerow(fila)
    

    Esto debería crear un archivo CSV con el formato deseado. Ten en cuenta que esta implementación asume que el archivo de texto de entrada tiene una estructura de datos consistente, donde las regiones y condados se enumeran en la primera columna y los datos correspondientes se encuentran en columnas subsecuentes separadas por tabuladores. Si la estructura varía, es posible que debas ajustar el código en consecuencia.

Comments are closed.