Decodierung eines Win10-outputs mit cp852 ist ok, mit cp1252 nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ulipy
User
Beiträge: 83
Registriert: Mittwoch 17. November 2021, 21:42
Wohnort: Ba-Wü

Hallo,
ich komm einfach nicht weiter mit diesem meinerseits sehr ungeliebten Thema (codecs) und frage mich, ob jemand helfen kann?
Ich versuche, eine von Win10 erzeugte Datei einzulesen.

Die Test-Datei enthält div. Umlaute sowie "ß".
(Diese Zeichen stehen ursprünglich in Dateinamen - dort würde man diese nicht haben wollen, normalerweise..)

Die Test-Datei wird von Win10 erzeugt:
  • dir /s > test-list.txt
Weit weg von "Durchblick" kann ich sagen:

Ausgangslage:
* Win10, deutsch als Sprach-Grundeinstellung
- weitestgehend Standard-Installation
- insbesondere keine beabsichtigten Veränderungen an irgendwelchen codecs, welche von Windows als Default(s)verwendet werden

Das Problem:
Die Umlaute etc. in der mit dir /s > test-list.txt erzeugten Datei lassens sich mit cp852 korrekt / lesbar einlesen, mit cp1252 jedoch nicht.

Es wurde jedoch (hier) verschiedentlich gesagt, dass Windows den output in cp1252 codieren würde.

Diesen (scheinbaren?) Widerspruch kann ich nicht auflösen - was mach ich hier falsch??
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Google ist hier ausnahmsweise mal dein Freund. Ich jedenfalls habe damit sofort das hier gefunden:
https://stackoverflow.com/questions/629 ... 0-terminal
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

@ulipy: Konsolen-Umleitungen sind unter Windows sehr unüblich. Eine Konsole hat als Default-Encoding cp852, an anderen Stellen ist das Default-Encoding vielleicht cp1252. Kommt halt auf den Fall an.
Wenn es um Dateinamen geht, würde man aber eher direkt die Verzeichnisse mit den passenden Funktionen lesen.
ulipy
User
Beiträge: 83
Registriert: Mittwoch 17. November 2021, 21:42
Wohnort: Ba-Wü

@pillmuncher
super danke - hatte die "falsche(n)" Fragen gestellt, da das Problem der Rückwärts-Kompatibilität nicht auf dem Radar war...

@Sirius3
Ja, wenn irgend möglich wird das ohne jegliches Zögern vermieden - bin dabei, einen größeren Dateibaum (> 1.000.000 Einträge) in die Weiterverarbeitung zu bekommen.

An dieser Stelle spielt leider die Laufzeit die entscheidende Rolle und in die BS-internen allocation table(s) werde ich nicht eingreifen wollen.
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
ulipy
User
Beiträge: 83
Registriert: Mittwoch 17. November 2021, 21:42
Wohnort: Ba-Wü

und auf anderem Weg wüßte ich (noch?) nicht: wie machen?
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Du suchst pathlib.Path.rglob.
Benutzeravatar
pillmuncher
User
Beiträge: 1530
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@ulipy: Welche falsche Frage hast du Google denn gestellt? Meine war: "windows 10" "cp852". Der Link oben war das zweite Ergebnis.
In specifications, Murphy's Law supersedes Ohm's.
ulipy
User
Beiträge: 83
Registriert: Mittwoch 17. November 2021, 21:42
Wohnort: Ba-Wü

@Sirius3
danke für den Tip - hatte dies bisher nicht gekannt - ist sicher das "Beste" für die hauptsächliche, allerdings erst im nachfolgenden Schritt geplante Detail-Analyse des Verz.-Baums (einschl. Dateien).

Jetzt konnte ich sehen, dass der Aufruf ein "generator object" zurückgibt - dies scheint für den ersten Schritt nicht das Richtige.

Es geht im ersten Schritt für eine grobe Abschätzung der "Mengen" lediglich um diese Übersichts-Informationen:

dir C:\ /s > dir_C_s.txt
...
...
Anzahl der angezeigten Dateien:
914275 Datei(en), 292.203.259.623 Bytes
612829 Verzeichnis(se), 196.440.002.560 Bytes frei

Execution time in seconds: 132.6129128932953

2.344.935 lines in output file
(bei einem großen Baum)

Die bisherigen Tests sowohl mit Win-Konsolen- als auch mit Py-Mitteln zeigten bisher einen erheblichen Laufzeitunterschied von ca. 130 (Win) und ca. 299 sec. (Py [glob]).

Bei "kleinen" Bäumen spielt dies natürlich kaum eine Rolle - bei größeren schon. Da "sitzt" Win näher an den Quell-Informationen, denke ich.

@pillmuncher
hatte Windows als Verursacher des Problems nicht gezielt in die Suche einbezogen - dann kommen beim Thema codecs gerne auch mal tausende (für mich) schwer nachvollziehbare bzw. verwendbare Vorschläge...
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ulipy: Ich finde den Laufzeitunterschied jetzt nicht wirklich schlecht. Du vergleichst da ein in C oder C++ geschriebenes, seit Ewigkeiten existierendes Programm vom Hersteller des Betriebssystems mit etwas selbst geschriebenen in der wahrscheinlich langsamsten dynamischen Programmiersprache die allgemein verwendet wird und hast nur einen Unterschied der kleiner als Faktor 2,5 ist. Wenn das ein Problem ist, dann ist Python wahrscheinlich nicht die Sprache die Du verwenden solltest/kannst.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
sparrow
User
Beiträge: 4536
Registriert: Freitag 17. April 2009, 10:28

@ulipy: Welche Informationen willst du denn haben? Die reine Anzahl der Dateien und Verzeichnisse?

Insbesondere, weil die Ausgabe von dir mit Vorsicht zu genießen ist:

Code: Alles auswählen

D:\>tree test
Auflistung der Ordnerpfade für Volume D
Volumeseriennummer : 00000011 0F67:51EA
D:\TEST
└───test2

D:\>dir /s test
 Datenträger in Laufwerk D:
 Volumeseriennummer: 0F67:51EA

 Verzeichnis von D:\test

14.12.2021  10:46    <DIR>          .
14.12.2021  10:46    <DIR>          ..
14.12.2021  10:46    <DIR>          test2
               0 Datei(en),              0 Bytes

 Verzeichnis von D:\test\test2

14.12.2021  10:46    <DIR>          .
14.12.2021  10:46    <DIR>          ..
               0 Datei(en),              0 Bytes

     Anzahl der angezeigten Dateien:
               0 Datei(en),              0 Bytes
               5 Verzeichnis(se), 132.366.651.392 Bytes frei
5 Verzeichnisse also... soso.


Und nur damit wir das richtig verstehen: Du lässt einen riesigen Output von dir /s in eine Datei schreiben... um an die letzten 2 Zeilen zu kommen? Indem du die Datei dann in Python liest?
ulipy
User
Beiträge: 83
Registriert: Mittwoch 17. November 2021, 21:42
Wohnort: Ba-Wü

@__blackjack__
keine Frage - die Geschwindigkeit von glob (im Vergleich zu dir) ist ohne Klagen!

libpath wird danach für die detaillierte Analyse verwendet - eine riesen Erleichtertung - keine String Maniupulationen mehr etc etc. - bin begeistert!

@sparrow
die Frage ist:
wie komme ich am schnellsten zur Anzahl der Verzeichnisse und der Dateien?
Z. B. für den Fall, dass das Verzeichnis "C:" heißt und von einem DAU so gewollt ist?
Py::: 1. funktional zuverlässig, 2. Anfänger-lesbar, 3. Py-Konformität
Benutzeravatar
sparrow
User
Beiträge: 4536
Registriert: Freitag 17. April 2009, 10:28

@ulipy: So:

Code: Alles auswählen

def count_filesystem_objects(start_path):
    file_count = 0
    dir_count = 0
    for root, dirs, files in os.walk(start_path):
        file_count += len(files)
        dir_count += len(dirs)
    return file_count, dir_count
Antworten