Dateityp ermitteln

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
exidio
User
Beiträge: 18
Registriert: Dienstag 7. November 2017, 12:18

Guten Tag liebe Community.

Ich möchte in einem Verzeichnis die Dateien nach ihrem Dateityp untersuchen lassen, um sie dann entsprechend zu verwalten. Pseudo-Code sieht in etwa so aus:

Code: Alles auswählen

dir = "C:\Users\xxx\Zielordner\"
for file in dir:
	print(filename + " " + filetype)
Ich habe trotz der Befragung meines Freundes Google nichts passendes gefunden. Das, was sich am ehesten anhört, das magic-Modul, lässt sich natürlich ums verzweifeln nicht installieren....
Habt ihr vielleicht noch andere Ideen? :(
Habe aktuell Windoof10 und PyCharm. Der Link zum Modul auf Github: https://github.com/ahupp/python-magic

Danke und viele Grüße.
Benutzeravatar
pixewakb
User
Beiträge: 1408
Registriert: Sonntag 24. April 2011, 19:43

Du suchst das Modul os, das installiert ist (Standardbibliothek) und dann willst du for filename in os.listdir(PATH) als Schleife nutzen. Ich merke an, dass es auch Möglichkeiten im os-Modul gibt, um Informationen über die Dateien zu erhalten (ohne nachzusehen). Du kannst den Dateinamen (String!) splitten oder die letzten Zeichen abfragen. Sicher kannst Du dir so aber nicht sein, ob die Dateiendungen auch die Dateiformate sind, dazu müsstest du es einzeln prüfen, z. B. ob die Dateiköpfe passen (bei Bildern usw. geht das recht einfach, meine ich).
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Was hat denn bei der Installation von `python-magic` nicht geklappt?

Eventuell ist es auch einfacher, einfach das WSL zu installieren und `python-magic` darin zu installieren, weil die Abhängigkeiten alle schon erfüllt sein sollten.

Anstatt der Funktionen aus dem `os`-Modul würde ich `pathlib` empfehlen:

Code: Alles auswählen

In [1]: !ls -F
bar.png  baz.py/  foo.txt

In [2]: from pathlib import Path

In [3]: for path in Path(".").iterdir():
   ...:     if path.is_file():
   ...:         print(path.stem, path.suffix)
   ...:
bar .png
foo .txt
exidio
User
Beiträge: 18
Registriert: Dienstag 7. November 2017, 12:18

Guten Morgen und schon Mal danke euch.
@narpfel: Dein Code funktioniert soweit, danke dir! Immerhin habe ich schon mal die Endungen der Files.
Zu deiner Frage: wenn ich im Terminal "pip install libmagic" eingebe, kommt die Meldung, dass es erfolgreich installiert wurde. Im Quellcode erscheint kein Fehler mehr. Wenn ich es aber ausführen möchte, kommt der Fehler am Schluss zitiert. Reinstall des Moduls, reboot etc. pp. hat nichts geändert. Sueccessfully installed aber findet das Modul trotzdem nicht.... :?
Traceback (most recent call last):
File "C:/Users/xxxxxxxx/PycharmProjects/Projects/Sonstiges/Filetype.py", line 8, in <module>
import magic
File "C:\Users\xxxxxxxx\AppData\Local\Programs\Python\Python36\lib\site-packages\magic.py", line 176, in <module>
raise ImportError('failed to find libmagic. Check your installation')
ImportError: failed to find libmagic. Check your installation
exidio
User
Beiträge: 18
Registriert: Dienstag 7. November 2017, 12:18

Ach ja, was ich auch nicht verstehe:
Ich habe zwar Python 2.7 und 3.6 installiert, allerdings will PyCharm das in den default settings nicht ganz einsehen. Immer wieder muss ich den default interpreter auswählen, und selbst wenn ich 3.6 ausgewählt habe, meckert er beim import von pathlib:
Python version 2.7 does not have module pathlib less... (Ctrl+F1)
Enable this inspection if you need your code to be compatible with a range of Python versions (for example, if you're building a library). The range of Python versions with which the code needs to be compatible can be specified in the inspection settings
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Hast du denn die Installationsanleitung abgearbeitet? Mit `pip install libmagic` installierst du das hier, das mit `python-magic` nichts zu tun hat.

Zum PyCharm-Problem: Naja, du hast in PyCharm anscheinend nicht richtig eingestellt, dass Python 3.6 benutzt werden soll. (Gut, da bist du wahrscheinlich auch drauf gekommen. :wink:) Ich kenne PyCharm zwar nicht [1], aber ich vermute, dass es eine Einstellung für den Interpreter, mit dem das Programm ausgeführt wird, und eine für die Pythonversion, die PyCharm zum Syntaxcheck und zur Fehlersuche benutzt, gibt.

[1]: Ich finde, dass eine IDE in Python keinen Mehrwert gegenüber einem guten Texteditor bietet, weil das, wobei einem IDEs helfen (hauptsächlich Boilerplate, Refactoring, Kompilierung und Autocompletion) in Python nicht nötig oder zu schwer für IDEs ist.
exidio
User
Beiträge: 18
Registriert: Dienstag 7. November 2017, 12:18

Okay, ich hab es jetzt genau so wie gewünscht, mit der Alternative von @napferl. Herzlichen Dank an alle!
Ich würde mich trotzdem auch noch für die Variante mit dem magic-Modul interessieren, falls ich dazu was finde, werde ich das hier rein posten.

Für alle die etwas ähnliches brauchen, teile ich natürlich gerne meinen Code. Es soll erst mal alle Dateien anzeigen mit Name und Typ, die Gesamtanzahl und die Anzahl der einzelnen Typen. Kann man natürlich dann entsprechend verändern/erweitern.

Code: Alles auswählen

import collections
from pathlib import Path

dest = 'C:\Windows'
arr = []
i = 0
d = collections.Counter()
c = 0

for path in Path(dest).iterdir():        #Path(".")
    if path.is_file():
        print('\nFilename: ' + path.stem)
        print('Filetype: ' + path.suffix)
        arr.insert(i, path.suffix)
        i += 1

for c in arr:
    d[c] += 1

print('\nDateien insgesamt: ', i)
print(d)
Zusammengefasste Ausgabe:
Filename: write
Filetype: .exe

Dateien insgesamt: 42
Counter({'.exe': 12, '.log': 6, '.ini': 4, '.ico': 3, '.dll': 3, '.EXE': 3, '.INI': 2, '.dat': 1, '.bat': 1, '.config': 1, '.LOG': 1, '.xml': 1, '.tmp': 1, '.bin': 1, '.Manifest': 1, '.prx': 1})
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@exidio: Listen kennen `append`. Du benutzt einen `Counter` aber nicht dessen Funktionalität. `c` bekommt einen Wert zugewiesen, der nicht benutzt wird. Allgemein sind einbuchstabige Namen zu kurz, um daran erkennen zu können, für was sie benutzt werden.

Code: Alles auswählen

import collections
from pathlib import Path

destination = 'C:\Windows'
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)
exidio
User
Beiträge: 18
Registriert: Dienstag 7. November 2017, 12:18

Verzeih mir meinen unsauberen Code, ich bin noch nicht lange mit Python unterwegs. Tutorials zu sauberem programmieren sind leider nicht sehr häufig zu finden, vor allem ist es als Neuling noch nicht so einfach. Vielen Dank für deine Variante, ein schönes Beispiel von schönem Code!
Antworten