Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

sylpard a écrit :

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

sylpard #10 a écrit :

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','')
sylpard #12 a écrit :

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 sad 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

sylpard #18 a écrit :

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("'")
sylpard #20 a écrit :

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

sylpard #24 a écrit :

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