Filetypes herausfinden und Computer nach Datei durchsuchen

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
exidio
User
Beiträge: 18
Registriert: Dienstag 7. November 2017, 12:18

Montag 18. Dezember 2017, 16:42

Guten Tag allesamt!

Da ich letztens (zu Testzwecken) eine bestimmte Datei(-endung) gesucht habe, wollte ich nicht über 405.113 Dateien von Hand durchsuchen. Daher ein kleiner Code-Schnipsel, in dem man entweder eine bestimmte Endung oder einen bestimmten Namen herausfinden kann. Dazu gibt man ein Verzeichnis an, alle Unterordner werden automatisch mit durchsucht. In dem Beispiel werden der Pfad, die Ordner innerhalb des Pfades und die Dateien ausgegeben. Will man eine spezielle Datei, ergibt auch die Funktion, den Pfad direkt ins Clipboard zu kopieren, einen praktischen Sinn.

Code: Alles auswählen

from pathlib import Path
import os
import pandas as pd

destination = 'C:\\'
suffixes = []
for root, dirs, files in os.walk(destination):  # root = Path, dirs = folders, files = files
    for file in Path(str(root)).iterdir():
        if file.suffix == '.mp3':  # oder -> file.stem == 'filename'
            print('Path: ', root, '\nFolders: ', dirs, '\nFiles:', files, '\n')
            df = pd.DataFrame([root])
            df.to_clipboard(index=False, header=False)
Wenn ihr unter die
for file [..]
folgendes schreibt:

Code: Alles auswählen

if file.suffix not in suffixes and (len(file.suffix) < 5):
    suffixes.append(file.suffix)
print(len(suffixes))
print(suffixes)
sieht man z.B. auch alle Dateitypen auf dem gesamten PC. Ich fand das ziemlich interessant um z.B. (jedoch ohne unnötig lange) Endungen zu finden, aber ist natürlich nur Spielerei.

Wenn ich schon dabei bin, möchte ich auch gleich weitere Beispiele zeigen.
Kleiner Off-Topic aber was man verbinden könnte, ist folgendes Beispiel:

Code: Alles auswählen

import collections

#t = open("text.txt", "r")
t = "#@}&$[[%]_&$+)$+)$!%{(}$^$}$!%{(}$^$}*$+)$!%{(}$^$}"
d = collections.Counter()
for c in t:
    d[c] += 1
print(d)
Hier kann man die Anzahl der jeweiligen Zeichen (oder Dateitypen) auslesen. Kann praktisch sein!

Etwas änhliches, Dateiname plus Typ ausgeben und die Suffixes separat ausgeben, in meinem Falle brauchte ich das.

Code: Alles auswählen

import collections
from pathlib import Path

destination = 'C:\\'
suffixes = []
for path in Path(destination).iterdir():
    if path.is_file():
        print('\nFilename:', path.stem)
        print('Filetype:', path.suffix)
        suffixes.append(path.suffix)

extensions = collections.Counter(suffixes)
print('\nDateien insgesamt:', len(suffixes))
print(extensions)
Das zeigt einem ALLE Dateien in diesem Verzeichnis, mit Name und Endung getrennt. Da findet man sogar versteckte Dateien die man nicht mal als Admin mit Einsicht in versteckte Dateien findet.... Wenn man das mit

Code: Alles auswählen

for root, dirs, files in os.walk(destination):  # root = Path, dirs = folders, files = files
    for file in Path(str(root)).iterdir()
verbindet, findet man natürlich alle Dateien auf dem PC. (nur falls sich einer wundert warum ich weiß, dass es genau 405.113 Dateien sind)

Wie auch immer, ein letztes Beispiel möchte ich noch teilen. Ein kleines Skript, dass verschiedene Dateitypen in entsprechende Ordner kopiert. Falls diese Ordner nicht existieren, werden sie erstellt. Erspart dem einen oder anderen vielleicht das mühsame sortieren einer Festplatte in Musik, Videos (natürlich nur anständige), Bilder, Dokumente oder was auch immer.


Hoffe dem ein oder anderen hilft so ein kleiner Schnipsel und kann es entsprechend für seinen Code gebrauchen, ich hatte auf jeden Fall meinen Spaß daran und werde diese Sachen mit Garantie häufiger benutzen.
Falls eine Verbesserungen hat, selbstverständlich immer gerne her damit.
Benutzeravatar
snafu
User
Beiträge: 5494
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Montag 18. Dezember 2017, 17:40

Schau dir zum Finden von Dateien mit einer bestimmten Endung mal Path.glob() an. Darauf aufbauend könnte man eine allgemein gehaltene Funktion in etwa so schreiben:

Code: Alles auswählen

from pathlib import Path

def get_paths(root='.', pattern='*', recursive=False):
    p = Path(root)
    if recursive:
        return p.rglob(pattern)
    return p.glob(pattern)

def main():
    print('Dateien mit Endung *.py im aktuellen Ordner:')
    for py_file in get_paths(pattern='*.py'):
        print(py_file)

if __name__ == '__main__':
    main()
Beim rekursiven Suchen ist natürlich immer die Gefahr da, dass man extrem viele Ergebnisse erhält und man auf die erstmal warten muss, wenn man alles sehen will. Da ist es manchmal sinnvoll, ein Trefferlimit einzubauen oder zu sagen, dass man z.B. maximal 2 Ebenen hinabsteigen will. So ausgereift ist Path.rglob() in der Hinsicht aber leider nicht...
shcol (Repo | Doc | PyPi)
Benutzeravatar
snafu
User
Beiträge: 5494
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Dienstag 19. Dezember 2017, 10:07

Achja, und zu den anderen Beispielen:

Code: Alles auswählen

# Alle Dateiendungen inkl. Unterverzeichnisse
from pathlib import Path
set(p.suffix for p in Path('/').rglob('*'))

# Anzahl einzelner Zeichen
from collections import Counter
text = "#@}&$[[%]_&$+)$+)$!%{(}$^$}$!%{(}$^$}*$+)$!%{(}$^$}"
print(Counter(text))
shcol (Repo | Doc | PyPi)
Antworten