Problème de changement de répertoire courant

Résolu/Fermé
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023 - 23 avril 2021 à 21:07
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 26 avril 2021 à 10:28
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()
A voir également:

12 réponses

Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 24 avril 2021 à 11:45
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 ...
0
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023
25 avril 2021 à 05:30
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.
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
25 avril 2021 à 09:48
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')
0
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023
25 avril 2021 à 10:35
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023
25 avril 2021 à 10:38
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')
0
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023
25 avril 2021 à 10:39
ça donne toujours le même message d'erreur...
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 25 avril 2021 à 10:54
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 ?
0
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023
25 avril 2021 à 11:26
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.
0
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023
25 avril 2021 à 11:36
(Essai_fichier_texte_2.txt est bien présent dans le même dossier que le fichier .py du script.)
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
Modifié le 25 avril 2021 à 11:48
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 ...)
0
Nico_63 Messages postés 41 Date d'inscription dimanche 3 novembre 2013 Statut Membre Dernière intervention 27 mai 2023
25 avril 2021 à 22:53
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...
0
Phil_1857 Messages postés 1883 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 178
26 avril 2021 à 10:28
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')
0