Étant donné que le traitement des caractères multi-octets est encore délicat dans la série Python 2 sous Windows, si vous écrivez normalement le processus d'énumération de fichiers, le processus d'énumération fonctionne bien lorsqu'un caractère spécifique ("table", "so", etc.) apparaît dans le chemin du fichier. Cela peut ne pas fonctionner. Ce qu'on appelle problème 5C.
C:/test
filelist.py
Tesuto/
a1.txt
a2.txt
table/
hyo1.txt
hyo2.txt
Table à l'intérieur/
hyo10.txt
hyo11.txt
filelist.py
# -*- coding: utf-8 -*-
import os
SEP = os.sep
def filelist(dir_path):
for item in os.listdir(dir_path):
file_path = dir_path + SEP + item
print(file_path)
if os.path.isdir(file_path):
filelist(file_path)
# test
script_dir = os.path.dirname(os.path.abspath(__file__))
filelist(script_dir)
C:\test\filelist.py
C:\test\Tesuto
C:\test\Tesuto\a1.txt
C:\test\Tesuto\a2.txt
C:\test\table
C:\test\table\table
L'énumération dans le chemin d'accès qui contient la "table" ne fonctionne pas.
@wonderful_panda m'a appris. Si vous faites .decode ('cp932') après avoir obtenu le chemin du fichier, vous pouvez énumérer les fichiers sans aucun problème.
# -*- coding: utf-8 -*-
import os
SEP = os.sep
def filelist(dir_path):
for item in os.listdir(dir_path):
file_path = dir_path + SEP + item
print(file_path)
if os.path.isdir(file_path):
filelist(file_path)
# test
script_dir = os.path.dirname(os.path.abspath(__file__.decode('cp932')))
filelist(script_dir)
C:\test\filelist.py
C:\test\Tesuto
C:\test\Tesuto\a1.txt
C:\test\Tesuto\a2.txt
C:\test\table
C:\test\table\hyo1.txt
C:\test\table\hyo2.txt
C:\test\table\中のtable
C:\test\table\中のtable\hyo10.txt
C:\test\table\中のtable\hyo11.txt
L'énumération dans le chemin contenant la "table" a également réussi.
La contre-mesure par décodage est extrêmement intelligente, mais je laisserai la contre-mesure que j'ai écrite avant de vous en parler.
filelist.py
# -*- coding: utf-8 -*-
import os
SEP = os.sep
def filelist2(dir_path):
old_dir = os.getcwd()
os.chdir(dir_path) #Changer le répertoire courant.
for item in os.listdir("."):
file_path = dir_path + SEP + item
print(file_path)
if os.path.isdir(item):
filelist2(file_path)
os.chdir(old_dir) #Restaurer le répertoire actuel.
# test
script_dir = os.path.dirname(os.path.abspath(__file__))
filelist(script_dir)
Si vous transmettez un chemin contenant des caractères 5C à os.listdir, un problème se produira. Par conséquent, au lieu de passer directement le chemin, définissez le répertoire actuel sur le chemin cible à l'avance et définissez le répertoire actuel sur os.listdir. Passez `".
```Indiquer le répertoire. Cela permet à l'énumération d'être effectuée normalement.
C:\test\filelist.py
C:\test\Tesuto
C:\test\Tesuto\a1.txt
C:\test\Tesuto\a2.txt
C:\test\table
C:\test\table\hyo1.txt
C:\test\table\hyo2.txt
C:\test\table\中のtable
C:\test\table\中のtable\hyo10.txt
C:\test\table\中のtable\hyo11.txt
L'énumération dans le chemin contenant la "table" a également réussi.
Même sous Windows, avec Python 3.5 etc., l'énumération des fichiers peut être effectuée normalement sans prendre de mesures comme celle-ci. S'il s'agit d'un nouveau programme connu pour effectuer le traitement de chaînes de caractères multi-octets, il est prudent de commencer avec la série Python 3 au lieu de la série Python 2.
J'ai essayé d'énumérer les fichiers par la même méthode (changer le répertoire actuel) avec PHP sous Windows, mais cela n'a pas fonctionné. J'ai essayé de capter beaucoup d'informations, mais en conclusion, il ne semble pas y avoir de solution en PHP?
This is not possible. It's a limitation of PHP. PHP uses the multibyte versions of Windows APIs; you're limited to the characters your codepage can represent.
If you set a breakpoint at readdir_r() in win32\readdir.c, you'll see that FindNextFile already returns a filename with question marks in place of the characters you want, so there's nothing you can do about it, apart from patching PHP itself.