#1 Le 16/11/2018, à 08:44
- sylpard
Lecture fichier Csv
Bonjour,
Je dispose de ce petit bout de code python afin d' extraire les données d' un fichier csv
import sys
import csv
with open("ACCTE.csv") as csvFile, open("result.csv", "w") as resultfile:
reader = csv.reader(csvFile)
writer = csv.writer(resultfile, lineterminator = "\n", delimiter=";")
for row in reader:
writer.writerow(["HG","ADD", row[0]])
writer.writerow(["HOST","ADD", row[1]])
Dans un premier temps je cherche a pouvoir indiquer au script qu' il doit commencer la lecteur à partir de la 4 éme ligne, comment puis je faire cela ?
ensuite j' aimerais pouvoir supprimer les simple quotes sur le resultat ci-dessous ?
HG,ADD,'pdaccteldb01'
HOST,ADD,'10.xxx.xx.73'
d' avance Merci pour votre aide
Dernière modification par sylpard (Le 16/11/2018, à 08:45)
Hors ligne
#2 Le 16/11/2018, à 08:58
- bipede
Re : Lecture fichier Csv
import sys
import csv
with open("ACCTE.csv") as csvFile, open("result.csv", "w") as resultfile:
reader = csv.reader(csvFile)
writer = csv.writer(resultfile, lineterminator = "\n", delimiter=";")
boucle = -1
for row in reader:
boucle += 1
if boucle > 3:
writer.writerow(["HG","ADD", row[0].replace("'", "")])
writer.writerow(["HOST","ADD", row[1].replace("'", "")])
Dernière modification par bipede (Le 16/11/2018, à 08:59)
Desktop: MSI - Intel® Core™ i5-3330 CPU @ 3.00GHz × 4 - RAM 8 go- Kubuntu 21.04 - Système sur SSD 64 Go - /home sur HDD 500 Go.
Laptop: DELL Inspiron-15 3567 - Intel® Core™ i5-7200 CPU @ 2.50GHz × 4 - RAM 8 go - HDD 1 To - Ubuntu 20.10 avec /home séparé.
Mon site: Les contributions du bipède
Hors ligne
#3 Le 16/11/2018, à 09:07
- sylpard
Re : Lecture fichier Csv
Super Merci beaucoup !
import sys
import csv
with open("ACCTE.csv") as csvFile, open("result.csv", "w") as resultfile:
reader = csv.reader(csvFile)
writer = csv.writer(resultfile, lineterminator = "\n", delimiter=";")
boucle = 0
for row in reader:
boucle += 1
if boucle > 4:
writer.writerow(["HG","ADD", csvFile])
writer.writerow(["HOST","ADD", row[0].replace("'", ""), row[1].replace("'", "")])
toujours dans le code ci-dessus j' aimerais qu' au niveau de
writer.writerow(["HG","ADD", csvFile])
au lieu de csvFile il m' indique uniquement le nom du fichier "ACCTE"
saurais tu me dire comment faire pour que le scripte ne boucle pas au niveau de l' ecriture, car il fait ceci:
HG;ADD;<open file 'ACCTE.csv', mode 'r' at 0x029277B0>
HOST;ADD;pdacctelas01;10.143.16.45
HG;ADD;<open file 'ACCTE.csv', mode 'r' at 0x029277B0>
HOST;ADD;pdacctelht01;10.143.11.42
et moi j' aimerais uniquement :
HG;ADD;<open file 'ACCTE.csv', mode 'r' at 0x029277B0>
HOST;ADD;pdacctelas01;10.143.16.45
HOST;ADD;pdacctelht01;10.143.11.42
Dernière modification par sylpard (Le 16/11/2018, à 10:47)
Hors ligne
#4 Le 16/11/2018, à 11:17
- bipede
Re : Lecture fichier Csv
import sys
import csv
with open("ACCTE.csv") as csvFile, open("result.csv", "w") as resultfile:
reader = csv.reader(csvFile)
writer = csv.writer(resultfile, lineterminator = "\n", delimiter=";")
boucle = 0
for row in reader:
boucle += 1
if boucle == 1:
writer.writerow(["HG","ADD", csvFile])
elif boucle > 4:
writer.writerow(["HOST","ADD", row[0].replace("'", ""), row[1].replace("'", "")])
Desktop: MSI - Intel® Core™ i5-3330 CPU @ 3.00GHz × 4 - RAM 8 go- Kubuntu 21.04 - Système sur SSD 64 Go - /home sur HDD 500 Go.
Laptop: DELL Inspiron-15 3567 - Intel® Core™ i5-7200 CPU @ 2.50GHz × 4 - RAM 8 go - HDD 1 To - Ubuntu 20.10 avec /home séparé.
Mon site: Les contributions du bipède
Hors ligne
#5 Le 16/11/2018, à 11:24
- sylpard
Re : Lecture fichier Csv
j'avais bidouillé cela pour sortir de la boucle en fait :
import sys
import csv
with open("ACCTE.csv") as csvFile, open("result.csv", "w") as resultfile:
reader = csv.reader(csvFile)
writer = csv.writer(resultfile, lineterminator = "\n", delimiter=";")
writer.writerow(["HG","ADD", 'ACCTE'])
boucle = 0
for row in reader:
boucle += 1
if boucle > 4:
writer.writerow(["HOST","ADD", row[0].replace("'", ""), row[1].replace("'", "")])
csvFile.close()
Hors ligne
#6 Le 16/11/2018, à 11:27
- sylpard
Re : Lecture fichier Csv
par contre, dans la ligne
writer.writerow(["HG","ADD", csvFile])
le fait d' infiquer csvFile me met en resultat
<open file 'ACCTE.csv', mode 'r' at 0x026FA0D0>
est il possible d' ecrire uniquement ACCTE ?
Hors ligne
#7 Le 18/11/2018, à 08:11
- bipede
Re : Lecture fichier Csv
par contre, dans la ligne
writer.writerow(["HG","ADD", csvFile])
le fait d' infiquer csvFile me met en resultat
<open file 'ACCTE.csv', mode 'r' at 0x026FA0D0>
est il possible d' ecrire uniquement ACCTE ?
Puisque c'est toi qui fournis le nom de fichier à ton programme écris tout simplement:
writer.writerow(["HG","ADD", "ACCTE"])
Desktop: MSI - Intel® Core™ i5-3330 CPU @ 3.00GHz × 4 - RAM 8 go- Kubuntu 21.04 - Système sur SSD 64 Go - /home sur HDD 500 Go.
Laptop: DELL Inspiron-15 3567 - Intel® Core™ i5-7200 CPU @ 2.50GHz × 4 - RAM 8 go - HDD 1 To - Ubuntu 20.10 avec /home séparé.
Mon site: Les contributions du bipède
Hors ligne
#8 Le 19/11/2018, à 08:50
- sylpard
Re : Lecture fichier Csv
Bonjour,
c'est moi qui fournis le nom du fichier mais je ne désire pas le renseigner manuellement dans les lignes ou il y a lieu !
par ailleurs il y a peut être un moyen d' indiquer de traiter le fichier courant (.csv) au lieu de le renseigner ?
Hors ligne
#9 Le 19/11/2018, à 08:54
- pingouinux
Re : Lecture fichier Csv
Bonjour,
Peut-être ceci
racine=repr(csvFile).split("'")[1].replace('.csv','')
writer.writerow(["HG","ADD", racine])
Hors ligne
#10 Le 19/11/2018, à 09:07
- sylpard
Re : Lecture fichier Csv
Super ça fonctionne !!!
import sys
import csv
with open("ACCTE.csv") as csvFile, open("result.csv", "w") as resultfile:
racine=repr(csvFile).split("'")[1].replace('.csv','')
reader = csv.reader(csvFile)
writer = csv.writer(resultfile, lineterminator = "\n", delimiter=";")
writer.writerow(["HG","ADD", racine])
boucle = 0
for row in reader:
boucle += 1
if boucle > 4:
writer.writerow(["HOST","ADD", row[0].replace("'", ""), row[1].replace("'", "")])
csvFile.close()
au niveau de la ligne
with open("ACCTE.csv") as csvFile, open("result.csv", "w") as resultfile:
l y aurait moyen de lui demander de traiter le fichier courant ?
Hors ligne
#11 Le 19/11/2018, à 09:27
- pingouinux
Re : Lecture fichier Csv
l y aurait moyen de lui demander de traiter le fichier courant ?
Qu'appelles-tu le fichier courant ?
S'il s'agit du seul fichier .csv situé dans le répertoire courant :
import sys, csv, glob
fic=glob.glob('*.csv')[0]
with open(fic) as csvFile, open("result.csv", "w") as resultfile:
....................
Hors ligne
#12 Le 19/11/2018, à 10:21
- sylpard
Re : Lecture fichier Csv
Super , c'est exactement cela ! Merci beaucoup
Il est possible de spécifier un dossier pour l' écriture du fichier result.csv ?
Hors ligne
#13 Le 19/11/2018, à 11:05
- pingouinux
Re : Lecture fichier Csv
Du coup, tu peux simplifier le calcul de la variable racine :
racine=fic.replace('.csv','')
Il est possible de spécifier un dossier pour l' écriture du fichier result.csv ?
with open(fic) as csvFile, open("/chemin_vers_le_répertoire/result.csv", "w") as resultfile:
Tu peux aussi donner le nom du répertoire en paramètre de ton script :
import os
repertoire=sys.argv[1]
...........................
with open(fic) as csvFile, open(os.path.join(repertoire,"result.csv"), "w") as resultfile:
Hors ligne
#14 Le 19/11/2018, à 11:30
- sylpard
Re : Lecture fichier Csv
arff il aime pas ....
IndexError: List index out of range
un petit problème d' indexation je pense ...:-) ?
import sys
import csv
import glob
import os
repertoire=sys.argv[1]
fic=glob.glob('*.csv')[0]
with open(fic) as csvFile, open(os.path.join(repertoire,"result.csv"), "w") as resultfile:
racine=repr(csvFile).split("'")[1].replace('.csv','')
reader = csv.reader(csvFile)
writer = csv.writer(resultfile, lineterminator = "\n", delimiter=";")
writer.writerow(["HG","ADD", racine])
boucle = 0
for row in reader:
boucle += 1
if boucle > 4:
writer.writerow(["HOST","ADD", row[0].replace("'", ""), row[1].replace("'", "")])
csvFile.close()
Hors ligne
#15 Le 19/11/2018, à 12:05
- pingouinux
Re : Lecture fichier Csv
Prends l'habitude de donner le retour complet des erreurs, entre balises-codes.
Je suppose que tu as appelé le script sans paramètre.
./le_script.py nom_du_repertoire
Hors ligne
#16 Le 19/11/2018, à 13:33
- sylpard
Re : Lecture fichier Csv
en fait je l' exécute sous W.... avec PyScripter et je ne peux pas spécifer le dossier .
Dernière modification par sylpard (Le 19/11/2018, à 13:37)
Hors ligne
#17 Le 19/11/2018, à 13:36
- pingouinux
Re : Lecture fichier Csv
Désolé, je ne connais ni PyScripter, ni W....
Hors ligne
#18 Le 19/11/2018, à 13:39
- sylpard
Re : Lecture fichier Csv
oui oui je comprends, j' ai mis un nom de dossier en "dur" et ca fonctionne
Merci de ton aide en tout cas !! c'est super sympa et j'ai du coup bien avancé
Dernière modification par sylpard (Le 19/11/2018, à 13:43)
Hors ligne
#19 Le 19/11/2018, à 13:43
- pingouinux
Re : Lecture fichier Csv
je peux lui spécifier un nom de dossier en "dur" j' imagine ?
Oui, bien sûr.
Hors ligne
#20 Le 19/11/2018, à 14:39
- sylpard
Re : Lecture fichier Csv
Voci le resultat rendu par le script .
HG;ADD;ACCTE
HOST;ADD;pdacctelas01;10.xxx.16.45
HOST;ADD;pdacctelht01;10.xxx.11.42
HOST;ADD;pdaccteldb02;10.xxx.16.46
HOST;ADD;pdacctelht02;10.xxx.11.48
HOST;ADD;pdacctelas03;10.xxx.16.47
HOST;ADD;pdaccteldb03;10.xxx.11.255
par rapport au script, comment est ce faisable de pouvoir "filtrer" par rapport au nom de la machine, le type de serveur pour que cela affiche comme ceci :
exemple;
si las => Tomc (tomcat)
si lht => Ap (apache)
si ldb => Bdd (base de données)
HG;ADD;ACCTE
HOST;ADD;Tomc-pdacctelas01;10.xxx.16.45
HOST;ADD;Ap-pdacctelht01;10.xxx.11.42
HOST;ADD;Bdd-pdaccteldb02;10.xxx.16.46
HOST;ADD;Ap-pdacctelht02;10.xxx.11.48
HOST;ADD;Tomc-pdacctelas03;10.xxx.16.47
HOST;ADD;Bdd-pdaccteldb03;10.xxx.11.255
Dernière modification par sylpard (Le 19/11/2018, à 14:39)
Hors ligne
#21 Le 19/11/2018, à 17:54
- pingouinux
Re : Lecture fichier Csv
Remarque :
Si les ' que tu veux supprimer sont aux extrémités de la chaîne de caractères, tu peux remplacer
row[0].replace("'", "")
par
row[0].strip("'")
comment est ce faisable de pouvoir "filtrer" par rapport au nom de la machine, le type de serveur
Pas de problème, si tu récupères le nom de la machine. Voici une façon de faire, mais il y a sans doute plus simple :
machine=os.popen('hostname','r').read()[:-1]
Édité :
Autre façon de faire
import socket
machine=socket.gethostname()
Dernière modification par pingouinux (Le 19/11/2018, à 18:30)
Hors ligne
#22 Le 20/11/2018, à 08:14
- sylpard
Re : Lecture fichier Csv
Non du-tout, l' idée c'est de pouvoir ajouter avant le nom machine, le type de serveur .
si le le nom de la machine se termine par :
las => Tomc (tomcat)
lht => Ap (apache)
ldb => Bdd (base de données)
et du coup cela donne :
HG;ADD;ACCTE
HOST;ADD;[b]Tomc[/b]-pdacctelas01;10.xxx.16.45
HOST;ADD;[b]Ap[/b]-pdacctelht01;10.xxx.11.42
HOST;ADD;[b]Bdd[/b]-pdaccteldb02;10.xxx.16.46
HOST;ADD;[b]Ap[/b]-pdacctelht02;10.xxx.11.48
HOST;ADD;[b]Tomc[/b]-pdacctelas03;10.xxx.16.47
HOST;ADD;[b]Bdd[/b]-pdaccteldb03;10.xxx.11.255
Hors ligne
#23 Le 20/11/2018, à 08:38
- pingouinux
Re : Lecture fichier Csv
Comment récupères-tu le nom de la machine ?
Hors ligne
#24 Le 20/11/2018, à 08:40
- sylpard
Re : Lecture fichier Csv
il est récupéré dans le fichier csv par le script row[0]
writer.writerow(["HOST","ADD", [b]row[0][/b].replace("'", ""), row[1].replace("'", "")])
Dernière modification par sylpard (Le 20/11/2018, à 08:44)
Hors ligne
#25 Le 20/11/2018, à 08:49
- pingouinux
Re : Lecture fichier Csv
il est récupéré dans le fichier csv par le script
Essaye d'être plus précis.
Je suppose qu'il s'agit du champ row[0], qui contient par exemple ceci : pdacctelas01
Comment en extrait-on le nom de la machine ?
- en ne tenant pas compte des chiffres à la fin ?
- en ne tenant pas compte des 2 derniers caractères ?
- autre chose ?
Hors ligne