Importar csv: remove o nome do arquivo dos nomes das colunas na primeira linha

Dec 01 2020

Estou usando o Python 3.5. Tenho vários arquivos csv:

Os arquivos csv são nomeados de acordo com uma estrutura fixa. Eles têm um prefixo fixo (sempre o mesmo) mais uma parte do nome do arquivo variável:

099_2019_01_01_filename1.csv
099_2019_01_01_filename2.csv

Meus arquivos csv originais são assim:

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

Estou manipulando esses arquivos usando o seguinte código (estou lendo os arquivos csv de uma pasta de origem e gravando-os em uma pasta de destino. Estou pulando algumas linhas, pois não desejo incluir essas informações):

Cortei as linhas TEXT, pois não preciso delas:

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) dá

filename1-Streetname filename1-ZIPCODE
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
Name1 2012932
Name2 3023923

A primeira linha contém o cabeçalho. Nos nomes dos cabeçalhos, há sempre o nome do arquivo (porém sem o prefixo 099_2019_01_01_) mais um "-". Falta o nome de arquivo que termina .csv. Eu quero remover este "nome do arquivo-" para cada arquivo csv.

A parte central agora é obter a primeira linha e apenas esta linha realizar uma substituição. Preciso cortar o prefixo e o .csv e, em seguida, realizar uma substituição geral. A primeira substituição pode ser algo assim:

  1. Posso começar com uma função para cortar os primeiros n sinais, já que o comprimento é fixo ou
  2. De acordo com esta solução apenas usestring.removeprefix('099_2019_01_01_')

Como tenho o Python 3.5, não posso usar removeprefix, então tento simplesmente substituí-lo.

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

Então preciso remover o .csv, o que é fácil:

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

Eu juntei isso e entendi (string.replace("099_2019_01_01_","")).replace(".csv",""). (Além disso, no final o "-" também precisa ser removido, veja no código abaixo). Não tenho certeza se isso funciona.

Meu principal problema agora é para esse código de importação csv que não sei como posso manipular apenas a primeira linha ao ler / escrever o csv. Portanto, quero substituir isso apenas na primeira linha. Eu tentei algo assim:

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)

Isso dá um erro, pois a ideia com rows [0] não está funcionando. Como posso fazer isso?

(Não tenho certeza se devo tentar incluir essa substituição no código ou colocá-la em um segundo código que é executado após o primeiro código. No entanto, eu iria ler e escrever arquivos csv novamente, presumo. Então, acho que sim ser mais eficiente para implementá-lo neste código. Caso contrário, eu preciso abrir, alterar e salvar todos os arquivos novamente. No entanto, se não for possível incluí-los neste código, eu também ficaria bem com um código que executa autônomo e apenas faz a substituição assumindo que o arquivo csv tem as linhas 0 como cabeçalho e então os dados vêm.)

Observe que eu quero seguir esse caminho com csv e não usar pandas.

EDITAR: no final, os arquivos csv devem ter a seguinte aparência:

Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232

Respostas

1 IoaTzimas Dec 01 2020 at 13:58

Tente substituir este:

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

Por isso em seu código:

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