Japanische Dateiaufzählung mit Python2-System unter Windows (Gegenmaßnahme gegen 5C-Probleme)

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.

Liste der für diesen Test verwendeten Dateien

C:/test
  filelist.py
Tesuto/
    a1.txt
    a2.txt
Tabelle/
    hyo1.txt
    hyo2.txt
Tisch drinnen/
      hyo10.txt
      hyo11.txt

Ein Skript, das die Dateiaufzählung normal schreibt

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)

Ausführungsergebnis

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.

Maßnahmen (Maßnahmen durch Dekodierung)

@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)

Ausführungsergebnis

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.

Gegenmaßnahme (alt. Gegenmaßnahme nach aktuellem Verzeichnis)

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.

Ausführungsergebnis

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.

Über die Python3-Serie

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.

Bonus: 5C Problemlösung in PHP

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

Japanische Dateiaufzählung mit Python2-System unter Windows (Gegenmaßnahme gegen 5C-Probleme)
OpenJTalk unter Windows 10 (Sprechen Sie Japanisch mit Python aus der Umgebungskonstruktion)
Unter Windows erstellte Python-CGI-Datei
Erste Schritte mit Python 3.8 unter Windows
[C] [Python] Lesen mit AquesTalk unter Linux
Hinweise zur japanischen OCR mit Python
Python unter Windows
Installieren Sie OpenCV 4.0 und Python 3.7 unter Windows 10 mit Anaconda
Entwickeln Sie Windows-Apps mit Python 3 + Tkinter (exe-Datei)
Zip mit Python extrahieren (unterstützt japanische Dateinamen)
Fordern Sie AtCoder (ABC) 164 mit Python heraus! A ~ C Problem
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Python ab Windows 7
Python Basic ② in Windows
PIL in Python unter Windows8 (für Google App Engine)
Installieren Sie Python unter Windows
Erstellen Sie Python3 für Windows 10 unter ARM mit Visual Studio 2019 (x86) unter Windows 10 unter ARM
Aktivieren Sie Python virtualenv unter Windows
Python mit VSCode (Windows 10)
Senden Sie japanische Post mit Python3
Führen Sie Python mit PyCharm aus (Windows)
Installieren Sie Watchdog unter Windows + Python 3.3
Problemumgehung für sys.argv wird nicht übergeben, wenn ein Python-Skript mit nur dem Dateinamen unter Python2.7 unter Windows ausgeführt wird
Zeichnen Sie eine netCDF-Datei mit Python
Python + Kivy-Entwicklung unter Windows
Sphinx-Autobuild (0.5.2) unter Windows7, Python 3.5.1, Sphinx 1.3.5
Schnellste Python-Installation unter Windows
Erstellen Sie eine Python-Umgebung unter Windows
Japanische morphologische Analyse mit Python
Erstellen Sie eine Python-Umgebung mit Windows
Ich habe Python unter Windows ausgeführt
Präsentationsunterstützungssystem mit Python3
[Python] [Chainer] [Windows] Chainer unter Windows installieren
Verwenden Sie Python unter Windows (PyCharm)
Zeitsynchronisation (Windows) mit Python
Laden Sie die CSV-Datei mit Python herunter
Bloggen mit Pelican unter Windows
Erstellen Sie eine 64-Bit-Python 2.7-Umgebung mit TDM-GCC und MinGW-w64 unter Windows 7
[AtCoder-Kommentar] Gewinnen Sie mit Python das ABC165 C-Problem "Many Requirements"!
Löse ABC163 A ~ C mit Python
Python-Umgebungskonstruktionsnotiz unter Windows 10
Extrahieren Sie die xz-Datei mit Python
Gesichtserkennung mit YOLO Face (Windows10, Python3.6)
Rufen Sie C von Python mit DragonFFI auf
Python 3.6 unter Windows ... und zu Xamarin.
Installieren von Kivy unter Windows 10 64bit Python3.5
Tipps zur Eingabe / Ausgabe von Python-Dateien
Aufbau einer Anaconda-Python-Umgebung unter Windows 10
[Python] Mit Python in eine CSV-Datei schreiben
[Mit Python automatisiert! ] Teil 1: Datei einstellen
Implementierter Dateidownload mit Python + Bottle
Python2.7-Installation in einer Windows 32-Bit-Umgebung
Zeichne Japanisch mit matplotlib auf Ubuntu
Installieren Sie Python unter Windows + pip + virtualenv
Ausgabe in eine CSV-Datei mit Python
ABC166 in Python A ~ C Problem