Seite 1 von 1
Dateityp ermitteln
Verfasst: Montag 20. November 2017, 13:39
von exidio
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.
Re: Dateityp ermitteln
Verfasst: Montag 20. November 2017, 14:56
von pixewakb
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).
Re: Dateityp ermitteln
Verfasst: Montag 20. November 2017, 18:12
von narpfel
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
Re: Dateityp ermitteln
Verfasst: Dienstag 21. November 2017, 13:01
von exidio
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
Re: Dateityp ermitteln
Verfasst: Dienstag 21. November 2017, 13:06
von exidio
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
Re: Dateityp ermitteln
Verfasst: Dienstag 21. November 2017, 13:37
von narpfel
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.

) 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.
Re: Dateityp ermitteln
Verfasst: Dienstag 21. November 2017, 13:41
von exidio
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})
Re: Dateityp ermitteln
Verfasst: Dienstag 21. November 2017, 14:13
von Sirius3
@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)
Re: Dateityp ermitteln
Verfasst: Dienstag 21. November 2017, 14:37
von exidio
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!