Importar csv: eliminar el nombre de archivo de los nombres de columna en la primera fila

Dec 01 2020

Estoy usando Python 3.5. Tengo varios archivos csv:

Los archivos csv se nombran de acuerdo con una estructura fija. Tienen un prefijo fijo (siempre el mismo) más una parte de nombre de archivo variable:

099_2019_01_01_filename1.csv
099_2019_01_01_filename2.csv

Mis archivos csv originales se ven así:

filename1-Streetname filename1-ZIPCODE
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
Name1 2012932
Name2 3023923

Estoy manipulando estos archivos usando el siguiente código (estoy leyendo los archivos csv de una carpeta de origen y escribiéndolos en una carpeta de destino. Estoy saltando ciertas filas porque no quiero incluir esta información):

Corté las filas de TEXTO, ya que no las necesito:

import csv
    
skiprows = (1,2,3,4,5,6)
for file in os.listdir(sourcefolder):
    with open(os.path.join(sourcefolder,file)) as fp_in:
        reader = csv.reader(fp_in, delimiter=';')
        rows = [row for i, row in enumerate(reader) if i not in skiprows]
        with open(os.path.join(destinationfolder,file), 'w', newline='') as fp_out:
            writer = csv.writer(fp_out)
            writer.writerows(rows)

(este código funciona) da

filename1-Streetname filename1-ZIPCODE
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
Name1 2012932
Name2 3023923

La primera fila contiene el encabezado. En los nombres de las cabeceras siempre aparece el nombre del archivo (sin embargo, sin el prefijo 099_2019_01_01_) más un "-". Falta el nombre de archivo que termina .csv. Quiero eliminar este "nombre de archivo-" para cada archivo csv.

La parte principal ahora es obtener la primera fila y solo para que esta fila realice un reemplazo. Necesito cortar el prefijo y el .csv y luego realizar un reemplazo general. La primera actualización podría ser algo como esto:

  1. O podría comenzar con una función para cortar los primeros n signos, ya que la longitud es fija o
  2. De acuerdo con esta solución, solo usestring.removeprefix('099_2019_01_01_')

Como tengo Python 3.5, no puedo usar removeprefix, así que intento simplemente reemplazarlo.

string.replace ("099_2019_01_01_", "")

Entonces necesito eliminar el .csv que es fácil:

string.replace(".csv","")

Pongo esto junto y obtengo (string.replace("099_2019_01_01_","")).replace(".csv",""). (Además, al final, el "-" también debe eliminarse, consulte el código a continuación). No estoy seguro de si esto funciona.

Mi principal problema ahora es para este código de importación csv que no sé cómo puedo manipular solo la primera fila al leer / escribir el csv. Así que quiero reemplazar esto solo en la primera fila. Intenté algo como esto:

import csv
    
skiprows = (1,2,3,4,5,6)
for file in os.listdir(sourcefolder):
    with open(os.path.join(sourcefolder,file)) as fp_in:
        reader = csv.reader(fp_in, delimiter=';')
        rows = [row for i, row in enumerate(reader) if i not in skiprows]
        with open(os.path.join(destinationfolder,file), 'w', newline='') as fp_out:
            writer = csv.writer(fp_out)
            rows[0].replace((file.replace("099_2019_01_01_","")).replace(".csv","")+"-","")
            writer.writerows(rows)

Esto da un error porque la idea con las filas [0] no funciona. ¿Cómo puedo hacer esto?

(No estoy seguro de si debería intentar incluir este reemplazo en el código o ponerlo en un segundo código que se ejecuta después del primer código. Sin embargo, supongo que volvería a leer y escribir archivos csv. Así que creo que lo haría Sería más eficiente implementarlo en este código. De lo contrario, necesito abrir, cambiar y guardar cada archivo nuevamente. Sin embargo, si no es posible incluirlo en este código, también estaría bien con un código que se ejecute de forma independiente y simplemente lo reemplaza asumiendo que el archivo csv tiene las filas 0 como encabezado y luego vienen los datos).

Tenga en cuenta que quiero ir de esta manera con csv y no usar pandas.

EDITAR: Al final, los archivos csv deberían verse así:

Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232

Respuestas

1 IoaTzimas Dec 01 2020 at 13:58

Intente reemplazando esto:

rows[0].replace((file.replace("099_2019_01_01_","")).replace(".csv","")+"-","")

Por esto en su código:

x=file.replace('099_2019_01_01_','').replace('.csv', '')
rows[0]=[i.replace(x+'-', '') for i in rows[0]]