Da die Verarbeitung von Mehrbyte-Zeichen in Python 2-Serien unter Windows immer noch schwierig ist, funktioniert der Aufzählungsprozess gut, wenn ein bestimmtes Zeichen ("Tabelle", "so" usw.) im Dateipfad angezeigt wird, wenn Sie den Dateiaufzählungsprozess normal schreiben. Es kann nicht funktionieren. Sogenanntes 5C-Problem.
C:/test
filelist.py
Tesuto/
a1.txt
a2.txt
Tabelle/
hyo1.txt
hyo2.txt
Tisch drinnen/
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\Tabelle
C:\test\Tabelle\Tabelle
Die Aufzählung im Pfad, der die "Tabelle" enthält, funktioniert nicht.
@wonderful_panda hat mich unterrichtet. Wenn Sie nach dem Abrufen des Dateipfads .decode ('cp932') ausführen, können Sie die Dateien problemlos auflisten.
# -*- 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\Tabelle
C:\test\Tabelle\hyo1.txt
C:\test\Tabelle\hyo2.txt
C:\test\Tabelle\中のTabelle
C:\test\Tabelle\中のTabelle\hyo10.txt
C:\test\Tabelle\中のTabelle\hyo11.txt
Die Aufzählung im Pfad mit der "Tabelle" war ebenfalls erfolgreich.
Die Gegenmaßnahme durch Dekodierung ist überwältigend klüger, aber ich werde die Gegenmaßnahme, die ich geschrieben habe, belassen, bevor ich Ihnen davon erzähle.
filelist.py
# -*- coding: utf-8 -*-
import os
SEP = os.sep
def filelist2(dir_path):
old_dir = os.getcwd()
os.chdir(dir_path) #Ändern Sie das aktuelle Verzeichnis.
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) #Stellen Sie das aktuelle Verzeichnis wieder her.
# test
script_dir = os.path.dirname(os.path.abspath(__file__))
filelist(script_dir)
Wenn Sie einen Pfad mit 5C-Zeichen an os.listdir übergeben, tritt ein Problem auf. Anstatt den Pfad direkt zu übergeben, setzen Sie das aktuelle Verzeichnis im Voraus auf den Zielpfad und das aktuelle Verzeichnis auf os.listdir. Übergeben Sie `".
`` `Zeigt das Verzeichnis an. Dadurch kann die Aufzählung normal durchgeführt werden.
C:\test\filelist.py
C:\test\Tesuto
C:\test\Tesuto\a1.txt
C:\test\Tesuto\a2.txt
C:\test\Tabelle
C:\test\Tabelle\hyo1.txt
C:\test\Tabelle\hyo2.txt
C:\test\Tabelle\中のTabelle
C:\test\Tabelle\中のTabelle\hyo10.txt
C:\test\Tabelle\中のTabelle\hyo11.txt
Die Aufzählung im Pfad mit der "Tabelle" war ebenfalls erfolgreich.
Selbst unter Windows, mit Python 3.5 usw. kann die Dateiaufzählung normal durchgeführt werden, ohne dass solche Maßnahmen ergriffen werden. Wenn es sich um ein neues Programm handelt, von dem bekannt ist, dass es eine Mehrbyte-Zeichenfolgenverarbeitung durchführt, können Sie sicher mit der Python 3-Serie anstelle der Python 2-Serie beginnen.
Ich habe versucht, Dateien mit der gleichen Methode (Ändern des aktuellen Verzeichnisses) mit PHP unter Windows aufzulisten, aber es hat nicht funktioniert. Ich habe versucht, viele Informationen zu erhalten, aber abschließend scheint es in PHP keine Lösung zu geben?
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.
Recommended Posts