Je reçois un ioerror présenté ci-dessous lorsque vous essayez d'ouvrir un nouveau fichier en utilisant "Ouvrir (FNAME," W + ') ". Le message d'erreur complet est ci-dessous. p>
Le fichier n'existe pas, mais j'ai vérifié à l'aide d'utiliser "OS.Access (Name, OS.W_OK)" et "Noms OS.Path.Exists (Dir_Name)" que le répertoire parent pour le fichier existe. p>
Je me demande si le nom du fichier est trop long pour Windows, ou si je fais quelque chose de mal. Des conseils seraient appréciés. Merci beaucoup. P>
Message d'erreur: P>
ioerror: [errno 2] Aucun fichier ou répertoire de ce type: 'C: \ Documents et Paramètres \ Administrator \ OP_Models \ corp_network_nov12 \ Abcde_corporate_nov_12.project \ abcde_corporate_nov_12-ctr.rptd.dir \ ctr \ non Heures d'ouverture pour Semaines \ Hourly_Data_for_2_Weeks \ 1294897740 \ json.data \ link \ 0 \ link UTILISATION \ Analyzer393146160-Data0.js ' P> blockQuote>
5 Réponses :
Dans l'API Windows, la longueur maximale du chemin est limitée à 260 caractères. P>
http://msdn.microsoft. com / fr-nous / bibliothèque / aa365247% 28v = vs.85% 29.aspx p>
mise à jour: prépendez "\\? \" sur le chemin. P>
... Combiné à la valeur d'erreur très confuse; Il devrait être en breakingong, pas enoent. Je pense que c'est l'une de ces bugs de Windows obscur que tout le monde est confondu par au moins une fois à un moment donné de leur carrière.
Qu'en est-il des langues non anglaises? Je sens que le maximum est plus bas.
Si ce n'est pas la longueur du nom de fichier, c'est le contenu du nom de fichier ...
python traite '\ 12' comme une séquence de contrôle. P>
>>> open('.\12\n\r\file.txt') Traceback (most recent call last): File "<stdin>", line 1, in <module> IOError: [Errno 2] No such file or directory: '.\n\n\r\x0cile.txt' >>> open('./12/n/r/file.txt') <open file './12/n/r/file.txt', mode 'r' at 0x7ff83f98> C:\Users\johnysweb>copy .\12\n\r\file.txt con Blah 1 file(s) copied.
Vous préférez toujours utiliser des barres obliques en avant; Ils fonctionnent bien sous Windows et il en résulte du code qui est beaucoup plus susceptible de travailler sur d'autres plates-formes.
L'OP a utilisé un chemin de fichier correctement codé. Sinon, le message d'erreur aurait été différent (TypeError).
@CGOHLKE: S'il vous plaît voir ma deuxième mise à jour qui démontre l'exception ioerror code> avec le même texte que l'OP signalé.
Je pense que le codage est correct, car je viens d'essayer un nom de fichier différent (Sm.txt avec tout le chemin) qui me tient dans la limite de 260 caractères et qui fonctionnait sans exception. Je vois le fichier en cours de création.
@JohnsyWeb: Je ne doute pas que l'on puisse obtenir un ioerror à l'aide de noms de chemin incorrectement codés. Cependant, le nom de chemin utilisé par l'OP contient un octet null "\ 0" et cela conduira à un typeError dans la fonction ouverte. Il est également peu probable que le nom de 260 caractères de caractère soit typé manuellement par l'OP. Plus probablement, c'était le résultat d'un appel de la fonction.
Ça a du sens. Merci pour la clarification.
Voici quelques indicateurs connexes qui fonctionne pour moi (j'ai des noms de fichiers très longs et des chemins):
for d in os.walk(os.getcwd()): dirname = d[0] files = d[2] for f in files: long_fname = u"\\\\?\\" + os.getcwd() + u"\\" + dirname + u"\\" + f if op.isdir(long_fname): continue fin = open(long_fname, 'rb') ...
Merci beaucoup pour mentionner que la chaîne Python doit être une chaîne unicode - qui m'a sauvé!
Le OS.GETCWD () code> corrigé pour moi. Doit être tout le chemin, pas seulement un chemin relatif.
Vous pouvez corriger le module Tarfile avec ceci:
import tarfile def monkey_patch_tarfile(): import os import sys if sys.platform not in ['cygwin', 'win32']: return def long_open(name, *args, **kwargs): # http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx#maxpath if len(name) >= 200: if not os.path.isabs(name): name = os.path.join(os.getcwd(), name) name = "\\\\?\\" + os.path.normpath(name) return long_open.bltn_open(name, *args, **kwargs) long_open.bltn_open = tarfile.bltn_open tarfile.bltn_open = long_open monkey_patch_tarfile()
Vérifiez la longueur de l'ensemble du chemin, puis appendez le format de chemin Long Windows nécessaire. Il convient de noter que cela ne fonctionne pas pour accéder aux données provenant de répertoires distants, c'est-à-dire des chemins qui commencent par "\\ quelque_remote_location \". Pré> xxx pré> p>
Merci. La limite passe plus de 260 caractères. L'article MSDN mentionne que nous pouvons utiliser le préfixe "\\? \" Pour le nom de fichier long, juste curieux si quelqu'un sait comment je peux ajouter le préfixe au nom de fichier. Lorsque j'essaie de faire une opération "+" simple, je reçois une erreur EOL lors de la numérisation de la chaîne cotivée unique ". (fname = '\\? \' + fname)
Utilisation "\\\\?\\". Une chaîne brute ne fonctionnera pas dans ce cas.
Utilisez à l'avant les esclaves à la place. Voir également Stackoverflow.com/faq#howtoask
J'ai essayé d'utiliser le "\\\\\? \\" et "\\\\ noc \\? \\" en les ajoutant au nom du fichier et obtenu la même exception. N'importe quel chemin, lorsque j'essaie de créer un fichier dans l'Explorateur Windows, cela ne me permettrait pas de créer le fichier (Windows me bloque de l'ajout de caractères). Je suppose que c'est une limitation du système?