Problème de changement de répertoire courant [Résolu]

Signaler
Messages postés
18
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
25 avril 2021
-
Messages postés
1046
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
29 avril 2021
-
Bonjour.
La fonction ci-dessous réalise une copie de fichier texte. Elle fonctionne correctement mais je dois pour cela placer le fichier à copier dans le dossier « EP26 » où se trouve EduPython.exe qui me permet de lancer Python et la copie arrive au même endroit. Je voudrais que la fonction prenne le fichier à copier dans le dossier « Principal » et place la copie au même endroit. Mais lorsque dans le sript (qui a été enregistré dans le dossier « Principal »), au dessus de la définition de la fonction, je rajoute les deux lignes suivantes, j’obtiens un message d’erreur lorsque j’utilise la fonction.

from os import *
chdir('D:/Mes autres documents/divers/Python/Principal')


Message d’erreur :

Traceback (most recent call last):
  File "<string>", line 449, in runcode
  File "<interactive input>", line 1, in <module>
  File "D:\Mes autres documents\divers\Python\Principal\module1.py", line 5, in copie_fichier
    fs = open(source, 'r')
TypeError: an integer is required (got type str)


C’est pareil si au lieu d’insérer ces deux lignes au début du script, je les rentre directement au niveau de l’interpréteur, après avoir exécuté le script et avant d’utiliser la fonction.

Je ne comprends pas pourquoi j’obtiens ce message d’erreur.
Si quelqu’un peut me dire comment faire ce que je souhaite…
Merci d’avance.

Code :

def copie_fichier(source, destination):                       # source et destination sont des chaînes de #
    fs = open(source, 'r')					                              # caractères (noms des fichiers) #
    fd = open(destination, 'w')
    while True :
        txt = fs.read(40)
        if txt == '' :
            break
        else :
            fd.write(txt)
    fs.close()
    fd.close()

12 réponses

Messages postés
1046
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
29 avril 2021
112
Bonjour,

Que veux tu faire exactement ?

Avec ta boucle while, tu lis ton fichier par blocs de 40 octets:

txt = fs.read(40)


et pas ligne par ligne, c'est bien ça que tu veux ?

Sinon, chez moi, ton code marche bien ...
Messages postés
18
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
25 avril 2021

Bonjour Phil_1857.
La boucle while lit le fichier par 40 caractères. Le problème n'est pas là.
Je te remets ci-dessous les paragraphes de mon message initial qui expliquaient mon problème.

La fonction ci-dessous réalise une copie de fichier texte. Elle fonctionne correctement mais je dois pour cela placer le fichier à copier dans le dossier « EP26 » où se trouve EduPython.exe qui me permet de lancer Python et la copie arrive au même endroit. Je voudrais que la fonction prenne le fichier à copier dans le dossier « Principal » et place la copie au même endroit. Mais lorsque dans le sript (qui a été enregistré dans le dossier « Principal »), au dessus de la définition de la fonction, je rajoute les deux lignes suivantes, j’obtiens un message d’erreur lorsque j’utilise la fonction.
...
C’est pareil si au lieu d’insérer ces deux lignes au début du script, je les rentre directement au niveau de l’interpréteur, après avoir exécuté le script et avant d’utiliser la fonction.
Messages postés
1046
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
29 avril 2021
112
Bonjour Nico,

Effectivement, j'avais la même erreur que toi

Apres quelques tests, j'ai fait ceci et ça fonctionne (import os) :
# -*- coding:Latin-1 -*-

import os

os.chdir(r'C:\Phil\Dev\Python\tests')

def copie_fichier(source, destination):

    fs = open(source, 'r')
    fd = open(destination, 'w')
    while True :
        txt = fs.read(40)
        if txt == '' :
            break
        else :
            fd.write(txt)
    fs.close()
    fd.close()

copie_fichier('t.txt', 't2.txt')
Messages postés
18
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
25 avril 2021

Phil,

j'ai déjà testé cela (voir mon message initial).
Je viens de retester ces trois variantes:

from os import *
chdir('D:/Mes autres documents/divers/Python/Principal')


import os
chdir('D:/Mes autres documents/divers/Python/Principal')


import os
chdir(r'D:/Mes autres documents/divers/Python/Principal')


dans tous les cas, j'arrive au même message d'erreur...
Messages postés
18
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
25 avril 2021

pardon

from os import *
chdir('D:/Mes autres documents/divers/Python/Principal')

import os
os.chdir('D:/Mes autres documents/divers/Python/Principal')


import os
os.chdir(r'D:/Mes autres documents/divers/Python/Principal')
Messages postés
18
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
25 avril 2021

ça donne toujours le même message d'erreur...
Messages postés
1046
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
29 avril 2021
112
OK,

Reste à savoir ce que tu fais exactement, comment tu appelle ta fonction, etc. …

donc moi, je vis te décrire ce que je fais

Ce qui est sur c'est que ceci me donne exactement la même erreur que toi:

from os import *
chdir('D:/Mes autres documents/divers/Python/Principal')


Mon fichier t.txt est dans le répertoire

C:\Phil\Dev\Python\tests

Mon script Python test.py, qui contient le code que je t'ai posté précédemment

est dans le répertoire

C:\Phil\Dev\Python\tests\ccm

ils sont donc bien dans 2 répertoires différents

Pour exécuter mon script, je double-clique sur test.py

Il s'exécute dans l'invite de commandes:


Mais je pourrai aussi le lancer dans mon IDE (en l'occurrence IDLE), mais bon, ça ne change rien
# -*- coding:Latin-1 -*-

import os

os.chdir(r'C:\Phil\Dev\Python\tests')

def copie_fichier(source, destination):

    fs = open(source, 'r')
    fd = open(destination, 'w')
    while True :
        txt = fs.read(40)
        if txt == '' :
            break
        else :
            fd.write(txt)
    fs.close()
    fd.close()

copie_fichier('t.txt', 't2.txt')

input ('\nLe fichier t2.txt a été créé\nPresser Entrée ...')


Fais-tu exactement comme ça, avec le code complet comme ci-dessus ?
Messages postés
18
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
25 avril 2021

J'ai une version portable de Python sur clé USB. Cela me permet de travailler de façon nomade.
Mais je ne peux pas double-cliquer sur le fichier .py, car Python n'est pas installé sur l'ordinateur. J'exécute directement le script dans ma session de Python, puis j'appelle la fonction à la ligne de commande.







Je viens de m'apercevoir qu'avec les variantes 2 et 3 le message d'erreur est différent.

Traceback (most recent call last):
  File "<string>", line 449, in runcode
  File "<interactive input>", line 1, in <module>
  File "D:\Mes autres documents\divers\Python\astuces\Fichiers essai.py", line 5, in copie_fichier
    fs = open(source, 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'Essai_fichier_texte_2.txt'


Je vais devoir partir pour la journée. Je regarderai à nouveau ce soir. Merci à toi.
Messages postés
18
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
25 avril 2021

(Essai_fichier_texte_2.txt est bien présent dans le même dossier que le fichier .py du script.)
Messages postés
1046
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
29 avril 2021
112
Ah ok,

je ne peux donc pas tester dans les mêmes conditions que toi
mais on voit que le message a changé: cette fois, il dit qu'il ne trouve pas le fichier :

FileNotFoundError: [Errno 2] No such file or directory: 'Essai_fichier_texte_2.txt'

alors qu'au début il disait qu'il attendait un integer au lieu d'une string:

TypeError: an integer is required (got type str)

Il y a un progrès :-)

par contre, peux-tu essayer en lançant la fonction dans le script comme je le fais, et non pas en ligne de commande ?

(il faut tout essayer ...)
Messages postés
18
Date d'inscription
dimanche 3 novembre 2013
Statut
Membre
Dernière intervention
25 avril 2021

Victoire !!!
Merci à toi Phil pour ton aide.
Voici le sript final:

import os
rep_cour = os.getcwd()
print(rep_cour)
os.chdir('D:/Mes autres documents/divers/Python/Principal')
rep_cour = os.getcwd()
print(rep_cour)

def copie_fichier(source, destination):                                         
    fs = open(source, 'r')
    fd = open(destination, 'w')
    while True :
        txt = fs.read(40)
        if txt == '' :
            break
        else :
            fd.write(txt)
    fs.close()
    fd.close()

source = input('Nom du fichier à copier :')
destination = input('Nom de la copie à créer :')
copie_fichier(source, destination)


A noter:

1/

from os import *
chdir('D:/Mes autres documents/divers/Python/brouillon')


ne fonctionne pas mais

import os
os.chdir('D:/Mes autres documents/divers/Python/brouillon')


fonctionne, alors que ces deux lignes sont normalement équivalentes !

2/ Ne pas oublier de changer les \ du chemin par des /.

3/ On ne peut pas apparemment lors d'un changement de répertoire courant appeler une fonction définie dans le script de la ligne de commande, mais il faut lancer la fonction dans le script lui-même (c'est la première fois que vois ça).

En tout cas, merci encore à toi.
En espérant que cela puisse servir à d'autres...
Messages postés
1046
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
29 avril 2021
112
Super !

2/ Ne pas oublier de changer les \ du chemin par des /.

non, car moi je met un r (pour raw string) devant la chaine du chemin:

os.chdir(r'D:\Mes autres documents\divers\Python\brouillon')