|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 10 ![]() |
Bonjour à tous,
Tout d'abord je tiens à préciser que je ne suis malheureusement pas un crack en programmation. Il va peut-être faloir être patient J'ai un petit soucis avec les caractères spéciaux. J'ai bien compris qu'il s'agit d'une différence d'encodage mais je n'arrive pas à m'en sortir. Voici le scénario: J'ai écrit un petit script dans lequel je définis en premier un répertoire soucre et un répertoire destination: SOURCE = "O:\\Rep1\\Sous-Rep1\\probläm\\" ARCHIVE = "O:\\Rep2\\Sous-Rep2\\probläm\\" L'ideé est d'aller chercher un fichier dans le répertoire source, de faire quelques opérations basiques dessus et de le sauvegarder dans le répertoire destination. Tout marche parfaitement à un détail près : les noms de ces répertoires contiennent des caractères spéciaux et je n'ai pas le droit de les changer (c'est sur un disque réseau dans mon entreprise et plusieurs personnes utilisent ces répertoires). Du coup à l'exécution j'ai ça: WindowsError: [Error 3] Le chemin d'accès spécifié est introuvable: 'O:\\Rep1\\Sous-Rep1\\probl\xe4m\\' Merci de votre aide! |
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() ![]() Inscription : octobre 2008 Messages : 936 ![]() |
Salut,
Essayes avec ceci: Code :
|
||
|
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 10 ![]() |
Salut,
Merci pour ta réponse! J'ai essayé mais j'ai eu le doit à ceci : SOURCE = src.encode(sys.getfilesystemencoding(), 'replace') NameError: name 'src' is not defined Y'a-t'il une librairie spéciale à charger? Pour le moment dans mes "import" j'ai: import os import shutil import re import sys Merci! |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 10 ![]() |
ah désolé!
Du coup j'ai corrigé ça et j'ai un autre type d'erreur UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 17: ordinal not in range(128) Une idée? Merci de ton aide! (pour information, les vrais noms de répertoires que j'utilise ne sont pas ceux-indiqués dans ce post pour des raisons de confidentialité en accord avec la politique de mon entreprise. Mais le caractère spécial qui pose problème est bien un ä) |
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 10 ![]() |
|
|
|
00
|
|
|
#7 | ||
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 693 ![]() |
Salut,
La plupart des erreurs que vous avez sont dues à la version de Python que vous utilisez (version 2.x). Si vous n'avez pas de bonnes raisons pour rester sous cette version, utilisez/apprenez avec une 3.2 ou mieux une 3.3. Si vous devez restez en 2.7... open accepte les noms de fichiers Unicode. Dans le cas de litéraux, il faut les préfixer par un "u": Code :
- W
__________________
Architectures Post-Modernes |
||
|
|
00
|
|
|
#8 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 10 ![]() |
Bonjour
J'ai téléchargé python 3.3 pour windows. Il semble effectivement que cette modification ait fait avancer un peu la chose car le caractère spécial ne semble plus poser de problème. MAIS J'ai maintenant un autre soucis llié à cette modification. Mon programme est censé regarder tous les fichiers qui sont dans le répertoire source, et pour ceux dont le nom a une certaine forme, les déplacer dans un répertoire de destination qui est de la forme source+nom de fichier. grosso modo le code est le suivant: SOURCE = "O:\\Rep1\\Sous-Rep1\\probläm\\" for file_name in os.listdir(SOURCE): if re.match(r'^(AB_01).*\.txt$',file_name):Je ne sais pas si c'est très clairFINAL_DEST = SOURCE+file_name[6:8]+"\\" Toujours est-il qu'avec cette nouvelle version de python j'ai maintenant: if re.match(r'^(VD_61).*\.txt$',file_name): File "C:\Python33\lib\re.py", line 156, in match return _compile(pattern, flags).match(string) TypeError: can't use a string pattern on a bytes-like object Et là j'ai un peu de mal à voit comment faire: si je convertis mon nom de fichier en bytes-like object, comment faire pour la concaténation de chaine qui définit le répertoire FINAL_DEST? Merci de votre aide! |
|
|
00
|
|
|
#9 |
|
Membre habitué
![]() Christian HavardDéveloppeur informatique Inscription : mai 2011 Messages : 100 ![]() |
Bonjour,
C'est bizarre mais, chez moi, quand j'essaie de reproduire ton problème avec python 3.3, le code fonctionne. Pour bien faire, il faudrait un exemple minimal un peu plus complet. Par exemple, quel est l'encoding du fichier source (celui qui contient le programme) ? Au passage, il est plus simple avec python de taper les path à la UNIX (c:/doc/fichier.txt plutôt que c:\\doc\\fichier.txt |
|
|
00
|
|
|
#10 |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 693 ![]() |
Si vous êtes en 3+, r'^(AB_01).*\.txt$' est unicode.
Par contre os.listdir retourne des bytes que lorsque son argument est bytes. Et telle que construite, SOURCE devrait être un str unicode. Impossible de comprendre cette erreur avec les informations que vous donnez! - W
__________________
Architectures Post-Modernes |
|
|
00
|
|
|
#11 | |
|
Invité de passage
![]() Inscription : février 2012 Messages : 10 ![]() |
Citation:
import os import shutil import re import sys SOURCE = "O:\\Rep1\\Sous-Rep1\\probläm\\" ARCHIVE = "O:\\Rep2\\Sous-Rep2\\probläm\\" def main(): #Task 1 : Remove useless files, and keep AB files for file_name in os.listdir(SOURCE):main() Encore merci du coup de main! |
|
|
|
00
|
|
|
#12 | ||
|
Membre habitué
![]() Christian HavardDéveloppeur informatique Inscription : mai 2011 Messages : 100 ![]() |
Bonjour
Tel quel, ton code devrait fonctionner. J'ai l'impression que ton problème vient de l'encodage du fichier source. Pour en être convaincu, essaie de faire si tu n'a pas str, ce n'est pas bon car, en python 3, tu ne peux mêler allègrement les type str et byte. Voici quelquesconseils En espérant t'avoir été utile |
||
|
|
00
|
|
|
#13 |
|
Membre habitué
![]() Christian HavardDéveloppeur informatique Inscription : mai 2011 Messages : 100 ![]() |
Oups, dans le dernier exemple, j'ai malencontreusement inséré une ligne blanche.
Bien entendu, pour que cela fonctionne, il ne s la mettre |
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() Inscription : février 2012 Messages : 10 ![]() |
Tout fonctionne comme je voulais maintenant!!
Merci de vos nombreux conseils et coups de main et bonne continuation. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com