Débutant bloqué par des if

Document Actions
Réponses: 9   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

Débutant bloqué par des if

Posté par bartoch le 25/08/2010 16:47
Bonjour,

je début en Python et je suis bloqué par un petit if qui compare une variable booléen.
Ce petit code me permet de modifier 2 fichiers csv, il retire les quottes puis le restitue avec le nouveau format.

le seul problème que j'ai est le IF, je veux qu'il ne rentre pas dans in1 ou in2 si le fichier n'est pas présent.

Je veux que dés le début il vérifie la présence du fichier puis face la modif que du fichier présent.

Au passage, je ne sais pas quoi mettre au ELSE final, comment quitter le programme proprement ?

MERCI

import os
import os,shutil
import os.path
in1 = os.path.isfile("c:\\in1.csv" )
in2 = os.path.isfile("c:\\in2.csv" )

if in1 == true:

Src = open("c:\\in1.csv","r" )
Dest = open("c:\\out1.csv","w" )
i=Src.read()
o=i.replace('"','')
Dest.write(o)
Src.close()
Dest.close()
shutil.copyfile("C:\\out1.csv","C:\\in1.csv" )
os.remove('c:\\out1.csv')

elif in2 == true:

Src = open("c:\\in2.csv","r" )
Dest = open("c:\\out2.csv","w" )
i=Src.read()
o=i.replace('"','')
Dest.write(o)
Src.close()
Dest.close()
shutil.copyfile("C:\\out2.csv","C:\\in2.csv" )
os.remove('c:\\out2.csv')

else:

Re: Débutant bloqué par des if

Posté par fredogo le 25/08/2010 18:39
Bonsoir,

Eh bien beaucoup de choses

1) Tester l'ouverture d'un fichier

Il est plus simple d'utiliser le bloc "try-except"

code:
try:    
f=open(tonfichier.csv, 'rb') 
except IOError:     
    print "fichier introuvable"


2) Les conditions

code:
if in2==True:


est équivalent à

code:
if in2:


Si on voulait tester un booléen avec une valeur à False

code:
if not in2:


Tout ces tests sont inutiles, car le bloc try-except fait correctement son travail.

3) Le choix des variables

code:
i=Src.read()
o=i.replace('"','')


est un code très moche. Choisir le bon nom de ses variables est important pour une continuité de développement du code et pour la lecture à d'autres codeurs, comme sur un forum par exemple ;)

J'écrirais plutôt

code:
data=Src.read()
output=data.replace('"', '')


4) Ton problème

Je pense qu'il est résolu, car comme je l'ai dis précédemment la boucle try-except va faire son travail.

Une fois le test de l'existence de ton fichier, il y a que 2 solutions possibles.

Soit ton fichier existe, il continuera la suite de ton code.

Soit ton fichier n'existe pas, on capture l'exception IOError et on indique que ce fichier n'existe pas etquittera le programme proprement.

5) Pour plus tard

Il va falloir regarder du côté des fonctions qui te permettront d'éviter les tâches répétitives.

J'espère avoir été le plus explicite possible :)

Re: Débutant bloqué par des if

Posté par bartoch le 26/08/2010 09:04
Bonjour,

Merci beaucoup.

Pour ce que tu m'as dit sur le try: en fait je veux qu'il continue et non se coupe directement.
Si le 1ere fichier n'est pas là ca veut dire qu'il ne traite pas le 2 eme vu qu'il aura un IOError.

Je viens de tester le if in1: mais même si le fichier n'existe pas il va renter dans le IF in1: alors qu'il a une valeur 'false'

J'ai cette erreur:
File "C:\prog.py", line 8
Src = open("c:\\in1.csv","r" )
^
IndentationError: expected an indented block

Re: Débutant bloqué par des if

Posté par fredogo le 26/08/2010 09:35
Pour ce que tu m'as dit sur le try: en fait je veux qu'il continue et non se coupe directement.
Si le 1ere fichier n'est pas là ca veut dire qu'il ne traite pas le 2 eme vu qu'il aura un IOError.


Eh bien c'est pas compliqué à faire, je t'ai donné les bases, pas les réponses. Ce n'est pas à moi de faire ton code mais bien à toi.

Je viens de tester le if in1: mais même si le fichier n'existe pas il va renter dans le IF in1: alors qu'il a une valeur 'false'


Tu n'as pas lu ce que j'ai écris, je suis blazé :(

Je t'ai dis que ce test était maintenant inutile car tu utilisais try-except. Encore une fois je t'ai donné une base pour coder plus lisiblement une condition if. Ce qui ne veut pas dire que tu dois l'utiliser dans ton code.

J'ai cette erreur:
File "C:\prog.py", line 8
Src = open("c:\\in1.csv","r" )
^
IndentationError: expected an indented block


Oui c'est une erreur d'indentation, il te le dit, donc tu indentes :)

Pourquoi il n'a pas prit mon indentation? Je ne sais pas.

Ce qui donne

code:
try:
    f=open(tonfichier.csv, 'rb')
except IOError:
    print "fichier introuvable"

Re: Débutant bloqué par des if

Posté par bartoch le 26/08/2010 13:35
J'ai trouvé !
Merci à toi, je comprend mieux ce que veut dire indentation.

code:
import os
import os,shutil


try:  
    Src = open("c:\\in1.csv","r" )
    Dest = open("c:\\out1.csv","w" )
    data=Src.read() 
    output=data.replace('"','')
    Dest.write(output)
    Src.close()
    Dest.close()
    shutil.copyfile("C:\\out1.csv","C:\\in1.csv")
    os.remove('c:\\out1.csv')
except IOError:      
    print ('fichier introuvable')

try:  
    Src = open("c:\\in2.csv","r" )
    Dest = open("c:\\out2.csv","w" )
    data=Src.read() 
    output=data.replace('"','')
    Dest.write(output)
    Src.close()
    Dest.close()
    shutil.copyfile("C:\\out2.csv","C:\\in2.csv")
    os.remove('c:\\out2.csv')
except IOError:
    print ('fichier introuvable')

Re: Débutant bloqué par des if

Posté par bartoch le 26/08/2010 13:36
J'ai trouvé !
Merci à toi, je comprend mieux ce que veut dire indentation.

code:
import os
import os,shutil


try:  
    Src = open("c:\\in1.csv","r" )
    Dest = open("c:\\out1.csv","w" )
    data=Src.read() 
    output=data.replace('"','')
    Dest.write(output)
    Src.close()
    Dest.close()
    shutil.copyfile("C:\\out1.csv","C:\\in1.csv")
    os.remove('c:\\out1.csv')
except IOError:      
    print ('fichier introuvable')

try:  
    Src = open("c:\\in2.csv","r" )
    Dest = open("c:\\out2.csv","w" )
    data=Src.read() 
    output=data.replace('"','')
    Dest.write(output)
    Src.close()
    Dest.close()
    shutil.copyfile("C:\\out2.csv","C:\\in2.csv")
    os.remove('c:\\out2.csv')
except IOError:
    print ('fichier introuvable')

Re: Débutant bloqué par des if

Posté par bartoch le 26/08/2010 14:08
Maintenant je voulais qu'il indique le nom du fichier manquant sans le taper à la main.

code:
try:   
    Src = open("c:\\in1.csv","r" ) 
except IOError:      
    print ("fichier introuvable" + str(src))


Il m'indique que src n'est pas défini, je pensais que le temps du TRY il allait quand meme alimenter la variable src et donc pouvoir afficher le contenu.

Re: Débutant bloqué par des if

Posté par fredogo le 26/08/2010 14:50
Il m'indique que src n'est pas défini


C'est justifié, déjà se ne serait pas src mais Src, python est sensible à la casse.

Qui puis-est Src ne renvoi pas un string, donc même si tu modifies ça ne fonctionnera toujours pas.

Le code correct (je pense):

code:
import os.path
file_input="c:\\in1.csv"
try:
    Src=open(file_input, 'rb')
except IOError:
    print "le fichier %s est introuvable" %(os.path.basename(file_input))


Attention code non testé!

Re: Débutant bloqué par des if

Posté par bartoch le 26/08/2010 15:03
Ca fct, un grand merci à toi.

Re: Débutant bloqué par des if

Posté par eyquem le 27/08/2010 22:50
DANS UN PREMIER TEMPS , je me suis dit qu’on peut condenser le code auquel vous aboutissez:

code:
import os.path,shutil 

try:
    with open("c:\\in1.csv","r" ) as Src,\
         open("c:\\out1.csv","w" ) as Dest:
        Dest.write(Src.read().replace('"',''))
        shutil.copyfile("C:\\out1.csv","C:\\in1.csv")
        os.remove('c:\\out1.csv') 
except IOError:
    if not os.path.isfile("c:\\in1.csv"):
        print ('fichier "c:\\in1.csv" introuvable') 

try:   
    with open("c:\\in2.csv","r" ) as Src,\
         open("c:\\out2.csv","w" ) as Dest:
        Dest.write(Src.read().replace('"',''))
        shutil.copyfile("C:\\out2.csv","C:\\in2.csv")
        os.remove('c:\\out2.csv')
except IOError:
    if not os.path.isfile("c:\\in2.csv"):
        print ('fichier "c:\\in2.csv" introuvable')


Le statement with ... as est disponible depuis la version 2.6.
Dans la version 2.5 il faut mettre from __future__ import with_statement en tête du code pour pouvoir utiliser ce statement.







DANS UN DEUXIEME TEMPS, j’ai testé:


code:
filename = 'C:\\Python27\\NEWS.txt'
f = open(filename,'r')
ch = f.read()
print "La longueur de " + filename + " est " + str(len(ch))
f.close()

filename = 'c:\\Python27\\NEWS.txt'
f = open(filename,'r')
ch = f.read()
print filename + " a une longueur de " + str(len(ch))
f.close()

filename = 'c:\\python27\\news.txt'
f = open(filename,'r')
ch = f.read()
print str(len(ch)) + ' est la longueur de ' + filename



me donne


code:
La longueur de C:\Python27\NEWS.txt est 233473
c:\Python27\NEWS.txt a une longueur de 233473
233473 est la longueur de c:\python27\news.txt


Donc, bien qu’en Python la casse compte, les noms de fichier dans open() sont une exception:
on peut écrire aussi bien open(’NEWS.TX’) que open(’NewS.TxT’) ou open(’neWs.TXT’) , etc.

Mais alors, au fait ! , comment est-on sûr du fichier que l’on ouvre avec une casse donnée s’il existe dans le répertoire un autre fichier avec le même nom dans une autres casse ?

Eh bien sous Windows en tous cas, deux fichiers différents avec des casses différentes du même nom identique, cela ne se peut pas. Si on essaie de créer un deuxième fichier avec une casse différente, l’OS Windows signale qu’il ne peut pas faire l’opération demandée parce qu’il existe déjà un fichier avec le même nom.
Ouf.

J’avoue que je ne connaissais pas ces deux caractéristiques concernant les noms de fichiers dans open() de Python et sous Windows.

Sous d’autres OS, je ne sais pas ce qu’il en est.



Tout ça pour dire que de ce fait, l’instruction
code:
shutil.copyfile("C:\\out1.csv","C:\\in1.csv")


est équivalente à

code:
shutil.copyfile("c:\\out1.csv","c:\\in1.csv")


Examinons alors ce que fait ton code:

code:
    with open("c:\\in1.csv","r" ) as Src,\
         open("c:\\out1.csv","w" ) as Dest:

        Dest.write(Src.read().replace('"',''))
        # on copie le contenu modifié de "c:\\in1.csv" dans "c:\\out1.csv"

        shutil.copyfile("C:\\out1.csv","C:\\in1.csv")
        # on recopie le contenu du nouveau fichier "c:\\out1.csv" dans un nouveau fichier "c:\\in1.csv" : ce faisant, le fichier "c:\\in1.csv" initial est écrasé

        os.remove('c:\\out1.csv') 
        # on détruit "c:\\out1.csv" , il ne retse donc plus qu’un fichier "c:\\in1.csv" de même nom que le fichier initial, mais dont le contenu n’est plus le même qu’au départ.


Total de l’opération: on a simplement modifié le contenu du fichier "c:\\in1.csv"








TROISIEME TEMPS:

je propose une manière plus simple de faire la même chose:

code:
from  os.path import isfile

if isfile("c:\\in1.csv"):
    with open("c:\\in1.csv","r+" ) as f:
        ch = f.read().replace('"','')
        f.seek(0)
        f.write(ch)
        f.truncate()
else:
    print ('fichier "c:\\in1.csv" introuvable') 



Et pour rendre ça générique:
code:
from  os.path import isfile

def elimine_doubles_quotes(filename):
    try:
        with open(filename,"r+" ) as f:
            ch = f.read().replace('"','')
            f.seek(0)
            f.write(ch)
            f.truncate()
    except:
        if not isfile(filename):
            print ('fichier ' + filename + ' introuvable')
        else:
            # autre raison
            pass
        
for n in ("c:\\in1.csv","c:\\in1.csv"):
    elimine_double_quotes(n)

Python.org : Le site officiel du langage Python.
Zope.org : Le site web officiel de Zope.
Daily Python-URL : Actus de l'univers Python.
Tribute to Zyons : Zyons notre ami et membre fondateur de l'Afpy, nous quittait en 2005.