Importar csv: remove o nome do arquivo dos nomes das colunas na primeira linha
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:
- Posso começar com uma função para cortar os primeiros n sinais, já que o comprimento é fixo ou
- De acordo com esta solução apenas use
string.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
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]]