Bonjour je suis nouveau en python et également nouveau sur le forum.
je dois mettre en place un script qui me permettrait de générer un fichier a partir de chaque ligne d'un fichier csv. j'ai réalise pas mal de recherche sur le net, et je ne trouve pas de solution à mon problème. C'est pourquoi je me permets de m'adresser à vous. Peut être que vous pourriez m'aider à trouver une solution.
import csv
def csvcount(filename):
with open(filename, 'r') as file:
i = 0
for ligne in file:
i += 1
return i
input_file = 'test.csv'
output_file = 'result.csv'
with open(input_file, newline='') as f, open(output_file, 'w') as result:
read = csv.reader(f, delimiter=';')
writer = csv.writer(result, lineterminator="\n", delimiter=";")
boucle = 0
for row in read:
boucle += 1
if boucle < csvcount(input_file):
writer.writerow(row) # je dois a terme génerer un fichier a partir d'une colonne du fichier csv
dans un premier temps avec le code ci dessus, je cherche a extraire uniquement une ligne dans un fichier. Mais a terme je voudrais extraire chaque ligne dans un fichier respectif, dont le nom du fichier sera récupérer dans une colonne du fichier csv
Merci d'avance pour votre aide.
- Edité par YannC974 6 janvier 2022 à 8:37:58
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: python;">Votre code ici</pre>.
Merci de modifier votre message d'origine en fonction.
Pour chaque ligne de ton fichier csv, tu devras ouvrir un autre fichier correspondant au nom exttrait de la ligne et le lire. Ça pourrait se faire plus facilement et plus lisiblement dans une fonction.
Le Tout est souvent plus grand que la somme de ses parties.
Pour chaque ligne de ton fichier csv, tu devras ouvrir un autre fichier correspondant au nom exttrait de la ligne et le lire. Ça pourrait se faire plus facilement et plus lisiblement dans une fonction.
Merci je vais explorer cette piste.
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
tu arrives donc à bien copier les lignes. As-tu essayé de faire un print de row par hasard dans ta boucle (entre la ligne 18 et 19 par exemple
Bonjour voici la réponse que j'obtiens en rajoutant le print(row)
with open(input_file, newline='') as f, open(output_file, 'w') as result:
read = csv.reader(f, delimiter=';')
writer = csv.writer(result, lineterminator="\n", delimiter=";")
boucle = 0
for row in read:
print(row)
boucle += 1
if boucle < csvcount(input_file):
writer.writerow(row) # je dois a terme génerer un fichier a partir d'une colonne du fichier csv
tu déduis quoi du print(row) ? que à chaque fois, il contient les valeurs de chaque ligne. Du coup si tu veux écrire chaque ligne dans un fichier, il faut créer chacun des fichiers à chaque accès de ligne donc dans la boucle, et non pas avant comme tu le fais actuellement.
Après, l'intérêt d'avoir une seule ligne dans un fichier est limitée je trouve.
tu déduis quoi du print(row) ? que à chaque fois, il contient les valeurs de chaque ligne. Du coup si tu veux écrire chaque ligne dans un fichier, il faut créer chacun des fichiers à chaque accès de ligne donc dans la boucle, et non pas avant comme tu le fais actuellement.
Après, l'intérêt d'avoir une seule ligne dans un fichier est limitée je trouve.
En effet il rajout tout dans un fichier, ce qui est normale car pour le moment je ne l'ai pas encore intégré dans mon code. Une seule ligne c'est peut être limité, mais c'est justement cela mon besoin aujourd'hui. De me limiter l'importation de chaque ligne dans un fichier (de configuration). par exemple un fichier s'appellera nom1, avec des paramètres dans ce fichier - critère 1 - critère 2 - critère 3 - critère 4
j'ai essayé de rajouter l'écriture de fichier dans la boucle comme ceci :
with open(input_file, newline='') as f, open(output_file, 'w') as result:
read = csv.reader(f, delimiter=';')
boucle = 0
for row in read:
boucle += 1
if boucle < csvcount(input_file):
writer = csv.writer(result, lineterminator="\n", delimiter=";")
writer.writerow(row)
Mais cela ne change pas le problème, effet il doit tout mettre dans le même fichier, mais normalement avec "w", il ne devrait pas écraser a chaque fois le fichier et n'afficher que l'importation d'une ligne (c'est à dire la dernière)? (si le code marche)
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
Mais cela ne change pas le problème, effet il doit tout mettre dans le même fichier, mais normalement avec "w", il ne devrait pas écraser a chaque fois le fichier et n'afficher que l'importation d'une ligne (c'est à dire la dernière)? (si le code marche)
Le fichier en écriture est ouvert via le with... pour toutes les itérations: ça écrira tout dans le même fichier. Si on veut créer un nouveau fichier à chaque itération, il faut coder différemment.
la solution (comme le suggèrent @mps et @umfred) est de créer tes fichiers dans ta boucle for :
with open(input_file) as f:
reader = csv.reader(f, delimiter=';')
headers = next(reader)
for row in reader:
with open(row[0], "w") as out_csv:
writer = csv.writer(out_csv, delimiter=";")
writer.writerows((headers, row))
Après si tu n"as pas besoin des entêtes des colonnes dans tes fichiers :
with open(input_file) as f:
reader = csv.reader(f, delimiter=';')
next(reader)
for row in reader:
with open(row[0], "w") as out_csv:
writer = csv.writer(out_csv, delimiter=";")
writer.writerow(row)
la solution (comme le suggèrent @mps et @umfred) est de créer tes fichiers dans ta boucle for :
with open(input_file) as f:
reader = csv.reader(f, delimiter=';')
headers = next(reader)
for row in reader:
with open(row[0], "w") as out_csv:
writer = csv.writer(out_csv, delimiter=";")
writer.writerows((headers, row))
Après si tu n"as pas besoin des entêtes des colonnes dans tes fichiers :
with open(input_file) as f:
reader = csv.reader(f, delimiter=';')
next(reader)
for row in reader:
with open(row[0], "w") as out_csv:
writer = csv.writer(out_csv, delimiter=";")
writer.writerow(row)
- Edité par Diablo76 il y a environ 1 heure
Super merci pour ce petit bout de code qui correspond à ce que je voulais par rapport aux lignes et fichiers. Maintenant que j'ai cette première étape de fait, il ne me reste plus qu'à normaliser les fichiers, à pouvoir poser les colonnes aux bons endroits.
Merci pour cette étape.
- Edité par YannC974 7 janvier 2022 à 8:27:59
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
moi, perso, plutôt que de faire un fichier par ligne, je mettrais tout dans un fichier en me basant sur soit un fichier type json, par exemple (il y a d'autres façons de le représenter):
Après, ça dépend effectivement de la demande. mais tu peux utiliser aussi utiliser ce type de structure pour chacun des fichiers. Et sous python, tu peut utiliser les modules json pour les fichiers json et configparser pour les fichiers ini. un exemple de mise en œuvre/tuto (qui date un peu, mais devrait encore fonctionner) https://deusyss.developpez.com/tutoriels/Python/les-modules-de-configuration/
moi, perso, plutôt que de faire un fichier par ligne, je mettrais tout dans un fichier en me basant sur soit un fichier type json, par exemple (il y a d'autres façons de le représenter):
Après, ça dépend effectivement de la demande. mais tu peux utiliser aussi utiliser ce type de structure pour chacun des fichiers. Et sous python, tu peut utiliser les modules json pour les fichiers json et configparser pour les fichiers ini. un exemple de mise en œuvre/tuto (qui date un peu, mais devrait encore fonctionner) https://deusyss.developpez.com/tutoriels/Python/les-modules-de-configuration/
Pour la compréhension de mon besoin, j'ai un fichier Excel dans lequel nous avons recensé les différents paramètres de transfert par system d'information etc.. Aujourd'hui pour une évolution de ces différents transfert on me demande de générer un fichier.ini ayant cette tête
C'est une exemple :
# CFT MMA S1
PART=N1WB01P (colonne 1)
# Ascii Ebcdic Text Windows
IDF=AETW01 (colonne 2)
# Format des records: V ou F
RECF=F (colonne E)
# Longueur des records
RECL=1900 (colonne 4)
# Identifiant CFTJOB
NIDF=DOSCPELA (Colonne 5)
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
En général, dans les fichiers ini, il y a un "header", c'est-à-dire un "titre" de section qui se met entre crochets [titre]; ça indique que les paramètres en dessous appartiennent à cette section. Après, effectivement, ça dépend du contexte et de l'utilisation (soit on cherche le fichier de tel système et on y lit les infos; soit on cherche dans un fichier unique, les infos de tel système)
exploiter un fichier csv en Python
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
Le Tout est souvent plus grand que la somme de ses parties.
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années
"Quand on ne peut pas changer le monde, il faut changer le décor."
Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années