Importer csv: supprimer le nom de fichier des noms de colonne de la première ligne

Dec 01 2020

J'utilise Python 3.5. J'ai plusieurs fichiers csv:

Les fichiers csv sont nommés selon une structure fixe. Ils ont un préfixe fixe (toujours le même) plus une partie de nom de fichier variable:

099_2019_01_01_filename1.csv
099_2019_01_01_filename2.csv

Mes fichiers CSV d'origine ressemblent à ceci:

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

Je manipule ces fichiers à l'aide du code suivant (je lis les fichiers csv à partir d'un dossier source et les écris dans un dossier de destination. Je saute certaines lignes car je ne souhaite pas inclure ces informations):

J'ai coupé les lignes TEXT, car je n'en ai pas besoin:

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)

(ce code fonctionne) donne

filename1-Streetname filename1-ZIPCODE
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
Name1 2012932
Name2 3023923

La première ligne contient l'en-tête. Dans les noms d'en-tête, il y a toujours le nom de fichier (mais sans le préfixe 099_2019_01_01_) plus un "-". Le nom de fichier se terminant par .csv est manquant. Je veux supprimer ce "filename-" pour chaque fichier csv.

La partie principale est maintenant d'obtenir la première ligne et uniquement pour cette ligne d'effectuer un remplacement. Je dois couper le préfixe et le .csv, puis effectuer un remplacement général. Le premier remplacement pourrait être quelque chose comme ceci:

  1. Soit je pourrais commencer par une fonction pour couper les n premiers signes, car la longueur est fixe, soit
  2. Selon cette solution, utilisez simplementstring.removeprefix('099_2019_01_01_')

Comme j'ai Python 3.5, je ne peux pas utiliser removeprefix, j'essaie donc de simplement le remplacer.

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

Ensuite, je dois supprimer le .csv, ce qui est facile:

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

Je mets cela ensemble et je reçois (string.replace("099_2019_01_01_","")).replace(".csv",""). (De plus, à la fin, le "-" doit également être supprimé, voir dans le code ci-dessous). Je ne sais pas si cela fonctionne.

Mon principal problème est maintenant pour ce code d'importation csv que je ne sais pas comment je peux manipuler uniquement la première ligne lors de la lecture / écriture du csv. Je veux donc remplacer cela uniquement dans la première rangée. J'ai essayé quelque chose comme ça:

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)

Cela donne une erreur car l'idée avec les lignes [0] ne fonctionne pas. Comment puis-je faire ceci?

(Je ne sais pas si je devrais essayer d'inclure ce remplacement dans le code ou de le mettre dans un deuxième code qui s'exécute après le premier code. Cependant, je lirais et j'écrirais à nouveau des fichiers csv, je suppose. Donc je pense que ce serait être le plus efficace pour l'implémenter dans ce code. Sinon, je dois ouvrir, modifier et enregistrer à nouveau chaque fichier. Cependant, s'il n'est pas possible de l'inclure dans ce code, je serais également très bien avec un code qui s'exécute de manière autonome et fait simplement le remplacement en supposant que le fichier csv a les lignes 0 comme en-tête, puis les données arrivent.)

Veuillez noter que je veux suivre cette voie avec csv et ne pas utiliser de pandas.

EDIT: À la fin, les fichiers csv devraient ressembler à ceci:

Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232

Réponses

1 IoaTzimas Dec 01 2020 at 13:58

Essayez de remplacer ceci:

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

Par ceci dans votre code:

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