Fonction pour ouvrir des dossiers windows

Asked by asaindrenan on 2014-02-12

J'ai rédigé un script permettant l'automatisation d'un processus de mise à jour de données ouverte.
Mon script fonctionne pour un jeux de données car je suis positionné sur un seul dossier.

J'ai plusieurs jeux de données qui appartiennent à des thématiques différentes.

Je cherche une fonction permettant de faire une boucle afin d'ouvrir les dossiers les uns après les autres.

Svp merci de répondre au plus vite

A.S

Question information

Language:
French Edit question
Status:
Solved
For:
Sikuli Edit question
Assignee:
No assignee Edit question
Solved by:
obiwan-92
Solved:
2014-02-25
Last query:
2014-02-25
Last reply:
2014-02-25
obiwan-92 (obiwan-92) said : #1

Hello,

 Next time try to ask the same in english, the answer will come faster.

In Sikuli, you use Python code (or more exactly Jython)
The loop are writing like this :
for item in list:
    print item # I am in the loop
print list # I'm not longer in the loop

I don't undestand what you want to do with the folder.
Do you want to open some file, check if there exists, analyse some text file ?

I will wait your answer.
Regards.

obiwan-92 (obiwan-92) said : #2

Bonjour,

La même chose en français.
Essayez de parler anglais, la prochaine fois, ce sera plus rapide pour avoir une réponse. ;)

Avec Sikuli, vous codez en Python ou plus exactement en Jython.

Pour faire une boucle :
for item in list:
    print item # Je suis dans la boucle
print list Je ne suis plus dans la boucle

Je ne comprends pas ce que tu veux faire avec les données contenus dans les dossiers.
Est ce que tu veux ouvrir un dossier, un fichier, vérifier si les dossiers/fichiers, analyser ce qui est écrit dans un fichier ?

Je vais attendre ta réponse.

Cordialement.

asaindrenan (asaindrenan-1) said : #3

Bonjour obiwan merci de ta réponse désolé pour le français.

J'ai des dossier de jeux de données windows ex : SOC16001_hebergement; SOC16002_placement etc...

Je voudrais réaliser une boucle sur ses dossiers afin de ne pas à avoir à se positionner manuellement sur ceux-ci.

Scénario : 1. j'ouvre une thématique "SOCIAL" -> 2. j'ouvre une sous-thématique "Enfance_et_Famille" -> 3. j'ouvre un jeux de données qui est composé de zip dspl et xls avec un metadata.xml

La reconnaissance de texte ne fonctionnant pas très bien comment faire pour réaliser un enchainement d'ouverture des dossiers de jeux de données.

Fonctions attendues : positionnement sur le premier jeux de données et exécution du script pour tous les jeux de données sans reprise manuel du curseur !

j'espère être assez clair dans mes explications

Mercii !!

obiwan-92 (obiwan-92) said : #4

Hello.

Pas la peine de vous excuser, c'est juste que je suis tout seul à parler français sur le forum. D'où l'énorme délai de la réponse.

Si je comprends bien vous voulez juste ouvrir explorateur de dossiers Windows avec une liste finie de dossiers à explorer.
Après ma question, c'est que vous voulez vous faire dans ces dossiers ?
Si c'est juste les ouvrir, mettez tous vos path dans une liste comme ci dessous:
import os
list = ["C:\path1", "C:\path2"]
for path in list:
    os.popen(os.getenv("windir") + "\explorer.exe "+ path)

Après si voulez faire quelque chose de spécifique dans vos dossier, on peut faire quelque chose de plus performant. Mais il faut que je sache ce que vous voulez faire. ;)

asaindrenan (asaindrenan-1) said : #5

On est deux maintenant ^^.

En fait dans chaque jeux de données j'ai des zip à réaliser à partir d'un dossier xls et un dossier donnéesDspl contenant :
- une feuille xls et un fichier txt pour le dossier xls
- des fichiers csv et un dataset.xml pour le dossier dspl

Le principe est donc de réaliser :
- un zip xls
- un zip dspl
- un zip final contenant le zip xls, le zip dspl ainsi que le metadata.xml

Je dois faire cette opération sur plus de 160 jeux de données.

Voyez- vous le principe ?

Best obiwan-92 (obiwan-92) said : #6

Dans les grandes lignes. ;)

Pas besoin de Sikuli pour ça, vous pouvez parfaitement le faire en ligne de commande.

Windows dispose d'une fonction pour les zip, dans une fenêtre cmd tapez compact /?.
Depuis python, ça donne os.popen("compact /? file.xls") Il faut remplacer /? par les bons paramètres.

Le truc important, c'est comment avoir vos répertoire et fichiers pour faire le zip.
Je pense que pour vous, ça devrait fonctionner comme suit
for file in os.listdir("C:\path"):
    if file.endswith("xls"):
        os.popen("compact /c /f "+ file) # Je compresse tous les fichiers xls existants dans C:\path

Normalement, ça devrait marcher.
Est ce que ça vous aide ?

asaindrenan (asaindrenan-1) said : #7

Pouvez vous me mettre un exemple avec un nom de chemin svp !

Puis-je choisir le nom du zip via cette méthode ou est-il généré automatiquement ?

obiwan-92 (obiwan-92) said : #8

Oui, d'ailleurs, je l'ai déjà fait. ;)
Le chemin que j'ai utilisé c'est C:\path.
Les autres éléments dans le code sont au choix des fonctions ou des variables.
Je pense que le zip est généré automatiquement.

Après ce n'était qu'un exemple, il existe d'autre outils pour générer des zip, qui fonctionne également en ligne de commande et qui permettent de changer le nom du zip destination (7zip, Winzip)...

... ou on peut aussi utiliser Python :
import os
import zipfile
votrepath = "C:\path" # Il vous faut juste changer le path
dest = "D:\path" # Et le dossier de destination
for file in os.listdir(votrepath):
    if file.endswith("xls"):
        zipfile.write(votrepath + file, dest + file) # Je zipe tous les fichiers xls dans le fichier de destination.

Je n'ai pas vérifié si ça fonctionne, mais ça ne devrait pas poser de problème.
Voilà le lien vers la librairie python qui s'occupe des zip : http://docs.python.org/2/library/zipfile.html

Bonne journée.

asaindrenan (asaindrenan-1) said : #9

Hello Obiwan !

J'ai trouvé une façon de gérer l'ouverture de mes fichiers les uns après
les autres :

metadata1 = r'C:/Program Files/Notepad++/notepad++.exe -x
"I:/Social/Personnes_handicapees/SOC16001_aide_hebergement/metadata.xml"'
App.open(metadata1)

Le seul problème c'est que la fonction App.close() ici App.close(metadata1)
ne fonctionne pas et je me retrouve vite avec pleins de fenêtres ouvertes .

Merci

Le 25 février 2014 16:16, obiwan-92
<email address hidden>a écrit :

> Your question #243791 on Sikuli changed:
> https://answers.launchpad.net/sikuli/+question/243791
>
> obiwan-92 posted a new comment:
> Oui, d'ailleurs, je l'ai déjà fait. ;)
> Le chemin que j'ai utilisé c'est C:\path.
> Les autres éléments dans le code sont au choix des fonctions ou des
> variables.
> Je pense que le zip est généré automatiquement.
>
> Après ce n'était qu'un exemple, il existe d'autre outils pour générer
> des zip, qui fonctionne également en ligne de commande et qui permettent
> de changer le nom du zip destination (7zip, Winzip)...
>
> ... ou on peut aussi utiliser Python :
> import os
> import zipfile
> votrepath = "C:\path" # Il vous faut juste changer le path
> dest = "D:\path" # Et le dossier de destination
> for file in os.listdir(votrepath):
> if file.endswith("xls"):
> zipfile.write(votrepath + file, dest + file) # Je zipe tous les
> fichiers xls dans le fichier de destination.
>
> Je n'ai pas vérifié si ça fonctionne, mais ça ne devrait pas poser de
> problème.
> Voilà le lien vers la librairie python qui s'occupe des zip :
> http://docs.python.org/2/library/zipfile.html
>
> Bonne journée.
>
> --
> You received this question notification because you asked the question.
>

obiwan-92 (obiwan-92) said : #10

Hello,

Bien vu.

Notepad++ est un outils trop souvent sous-estimé ;)

Pour la fonction close :
app1 = App.open("qqch")
app1.close()

Ca devrait mieux fonctionner.

See you.

asaindrenan (asaindrenan-1) said : #11

Ça fonctionne niquel merci ;) !!

2014-02-27 9:36 GMT+01:00 obiwan-92 <email address hidden>:

> Your question #243791 on Sikuli changed:
> https://answers.launchpad.net/sikuli/+question/243791
>
> obiwan-92 posted a new comment:
> Hello,
>
> Bien vu.
>
> Notepad++ est un outils trop souvent sous-estimé ;)
>
> Pour la fonction close :
> app1 = App.open("qqch")
> app1.close()
>
> Ca devrait mieux fonctionner.
>
> See you.
>
> --
> You received this question notification because you asked the question.
>

asaindrenan (asaindrenan-1) said : #12

Pense tu que je pourrais faire une liste avec cette fonction afin de faire
une boucle sur celle ci ?

metadata1 = r'C:/Program Files/Notepad++/notepad++.exe -x
"I:/Social/Personnes_handicapees/SOC16001_aide_hebergement/metadata.xml"'
xls1 = r'C:/Program Files/OpenOffice.org 3/program/scalc.exe -x
"I:/Social/Personnes_handicapees/SOC16001_aide_hebergement/SOC16001_xls/aide_hebergement_PH.xls"'

etc....

2014-02-27 9:49 GMT+01:00 Antoine Saindrenan <email address hidden>:

> Ça fonctionne niquel merci ;) !!
>
>
> 2014-02-27 9:36 GMT+01:00 obiwan-92 <email address hidden>
> :
>
> Your question #243791 on Sikuli changed:
>> https://answers.launchpad.net/sikuli/+question/243791
>>
>> obiwan-92 posted a new comment:
>> Hello,
>>
>> Bien vu.
>>
>> Notepad++ est un outils trop souvent sous-estimé ;)
>>
>> Pour la fonction close :
>> app1 = App.open("qqch")
>> app1.close()
>>
>> Ca devrait mieux fonctionner.
>>
>> See you.
>>
>> --
>> You received this question notification because you asked the question.
>>
>
>

obiwan-92 (obiwan-92) said : #13

Bien sûr.

Voici un petit tuto d'utilisation de liste,
Pour plus d'infos, va sur le site du zéro (openClassroom), voir le tutoriel python ;)
list = ["first value", "second value"] # On initialise la liste avec deux valeurs
list.append("third value") # On ajoute une troisieme valeur
for value in list: # On réalise une boucle sur toutes les valeurs de la liste
    print value # on affiche la valeur temporairement chargé dans value

asaindrenan (asaindrenan-1) said : #14

Cool par contre ma boucle doit pouvoir ouvrir le metada1 le fermer et ouvrir le metadata2 ainsi de suite..
Où dois-je mettre mes App.open ?

obiwan-92 (obiwan-92) said : #15

Dans la boucle, comme ceci :

for value in list:
    app1 = App.open(value)
    .... Vos autres actions...
   app1.close()

asaindrenan (asaindrenan-1) said : #16

salut obiwan !!

Nouvelle question j'ai une intervention à faire sur un fichier excel et
j'aurais besoin de savoir comment je pourrais dire à sikuli de réaliser la
duplication d'une année "2013" sur plusieurs lignes. " CTRL + souris vers
le bas" en manuel.

J'ai essayer plusieurs fonctions mais toujours rien !
MErci

2014-02-27 10:56 GMT+01:00 obiwan-92 <email address hidden>:

> Your question #243791 on Sikuli changed:
> https://answers.launchpad.net/sikuli/+question/243791
>
> obiwan-92 posted a new comment:
> Dans la boucle, comme ceci :
>
> for value in list:
> app1 = App.open(value)
> .... Vos autres actions...
> app1.close()
>
> --
> You received this question notification because you asked the question.
>

obiwan-92 (obiwan-92) said : #17

Hello,

Essayez de créer une nouvelle question la prochaine fois, je verrais vos questions plus vite. ;)
Ici, ça ne fait que deux heures, remarquez, mais c'est vrai que je regarde davantage les questions open que solved.

Pour bouger votre souris tout en maintenant une touche :
keyDown(Key.CTRL)
hover("img.png")
keyUp(Key.CTRL)

Si vous voulez vous pouvez pointer sur une position plutôt qu'une image.
Dans ce cas, remplacez hover("img.png")
par hover(Location(x, y))

Bonne journée.