Alle Dateien und Pfade in einem Verzeichnis

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
alltogo
User
Beiträge: 7
Registriert: Mittwoch 7. Januar 2015, 19:50

Hallo,

ich möchte ein Verzeichnis durchlaufen und dabei alle Dateien gepaart mit dem Verzeichnis in dem die Datei liegt, weiterverarbeiten. Dabei soll das gesamte Verzeichnis mit all seinen Unterordnern durchlaufen werden.

Ein Beispiel:
/home/Dokumente/1.txt
/home/test.txt

Dann möchte ich paare habe in der Form:
/home/Dokument/;1.txt
/home/;test.txt

Bisher habe ich mit diesem Code Schnipsel es versucht

Code: Alles auswählen

import os


for (root,dirs,files) in os.walk('./test'):
    print("Root:" + str(root))
    print("Verzeichnisse: " + str(dirs))
    print("Dateien: " + str(files))
  
Hat jemand eine Idee?

Grüße,
alltogo
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß nicht so recht, wo man da helfen soll? Du weißt, was Listen sind, und wie man die benutzt?

`os.walk` ist veraltet. Heutzutage benutzt man pathlib:

Code: Alles auswählen

from pathlib import Path

for path in Path('./test').rglob('*'):
    print(path)
alltogo
User
Beiträge: 7
Registriert: Mittwoch 7. Januar 2015, 19:50

Hallo Sirius,

mit deiner Antwort hast du mir schon geholfen, danke =)

Code: Alles auswählen

from pathlib import Path

filecounter = 0

for path in Path('./test').rglob('*'):   
    fileCut = str(path).rsplit("/",1)
    print(fileCut)

    filecounter += 1
print(filecounter)
So bekomme die Ausgabe genau wie ich sie haben wollte.

Code: Alles auswählen

['test', '1']
['test', '2']
['test/1', 'test']
['test/2', '3']
['test/2', 'test']
['test/2/3', 'test2']
['test/2/3', 'test']
['test/2/3', '4']
Grüße,
alltogo
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Pfade sind keine einfachen Strings, sondern Objekte, mit denen man bequem an die nötigen Informationen herankommt.

Code: Alles auswählen

from pathlib import Path

for filecount, path in enumerate(Path('./test').rglob('*'), 1):   
    print([path.parent, path.name])
print(filecounter)
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

Sirius3 hat geschrieben: Donnerstag 7. April 2022, 19:01 `os.walk` ist veraltet. Heutzutage benutzt man pathlib:
Das ist leider nicht ganz richtig: os.walk() arbeitet rekursiv, pathlib.Path.glob() nicht -- und ist daher offensichtlich kein adäquater Ersatz.

Code: Alles auswählen

#!/usr/bin/env python
import os
from pathlib import Path
from argparse import ArgumentParser

if __name__ == '__main__':
    parser = ArgumentParser(description='walk directory tree')
    parser.add_argument('directory', help='the directory')
    args = parser.parse_args()

    for dirpath, dirnames, filenames in os.walk(Path(args.directory)):
        for filename in filenames:
            print(Path(dirpath)/filename)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

@LukeNukem: und deswegen hat Sirius3 ja auch rglob verwandt, das r steht fuer recursive.

Code: Alles auswählen

#!/usr/bin/env python
from pathlib import Path
from argparse import ArgumentParser


def main():
    parser = ArgumentParser(description='walk directory tree')
    parser.add_argument('directory', help='the directory')
    args = parser.parse_args()

    for path in Path(args.directory).rglob("*"):
        print(path)


if __name__ == '__main__':
    main()
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

__deets__ hat geschrieben: Freitag 8. April 2022, 10:37 @LukeNukem: und deswegen hat Sirius3 ja auch rglob verwandt, das r steht fuer recursive.
Huch, stimmt... ich werde alt. ;-)
Antworten