GPS-Positionen auslesen

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
Mike525xia
User
Beiträge: 2
Registriert: Donnerstag 4. August 2022, 11:06

Hallo zusammen,

und zwar habe ich folgendes Problem:

Mein Code soll aus einem Ordner aus mehreren Dateien (z. B. Bilder) die GPS-Daten auslesen und in eine andere Datei schreiben. Der Code würde soweit schon funktionieren, jedoch durchsucht dieser nur immer ein Bilder und das immer wieder. Ich komme leider nicht darauf woran es liegt, dass er nicht die anderen Bilder durchsucht. Über eine kurze Hilfe wäre ich euch super dankbar.

file_write = open("/home/user/Desktop/Geo_information.csv", "w")
for filename in os.listdir("/home/user/Desktop/Bilder_Sm"):
with open(os.path.join("/home/user/Desktop/Bilder_Sm/", filename), "rb") as file:
file_write.write(filename + "\n")
for line in file:
tags = exifread.process_file(file)
for key, value in tags.items():
if key == "GPS GPSLatitude" or key == "GPS GPSLongitude":
values = (str(key) + ": " + str(value))
file_write.write(values + "\n")
else:
continue
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mike525xia: Die EXIF-Informationen werden für jede Zeile erneut ausgelesen. Mit der Zeile (`line`) macht das Programm auch überhaupt nichts und eine Schleife über Textzeilen aus einer JPG-Datei macht auch überhaupt gar keinen Sinn.

Weitere Anmerkungen zum Quelltext: Dateien die man öffnet, sollte man auch wieder schliessen. Am einfachsten/sichersten verwendet man dafür die ``with``-Anweisung beim öffnen der Datei.

Bei Textdateien sollte man immer explizit die Kodierung angeben. Wenn man die selbst wählen kann, bietet sich UTF-8 an, weil man dann sicher sein kann, das auch alle Unicode-Zeichen kodiert werden können.

Funktionen aus `os` und `os.path` die durch das `pathlib`-Modul ersetzt werden können, würde man in neuem Code durch eben dieses ersetzen.

Ich würde ja mindestens Testen ob es sich bei `filename` tatsächlich um eine Datei handelt, und im Grunde auch ob die Datei eine passende Endung hat (ich weiss jetzt nicht wie sich `exifread.process_file()` verhält wenn es eine unpassende Datei übergeben bekommt).

`tags` ist ein Wörterbuch. Da über alle Schlüssel/Wert-Paare zu iterieren und bei bestimmten Schlüssel etwas zu machen ist unnötig umständlich, weil man ja direkt über die bekannten Schlüssel auf die dazugehörigen Werte zugreifen kann.

Das zusammenstückeln von Zeichenketten und Werten mittels ``+`` und `str()` ist eher BASIC als Python. Dafür gibt es die `format()`-Methode auf Zeichenketten und f-Zeichenkettenliterale.

Das ``else`` mit dem ``continue`` ändert nichts am Programmablauf, kann also einfach wegfallen. Von ``continue`` würde ich sowieso die Finger lassen. Das ist ein unbedingter Sprung, den man nicht an der Einrückung erkennen kann und es kann beim herausziehen von Code in eigene Funktionen und beim Erweitern einer Schleife Probleme machen. Man kommt eigentlich immer ohne ``continue`` aus, und es macht Code nur sehr selten verständlicher.

Zwischenstand (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path

import exifread

DESKTOP_PATH = Path("/home/user/Desktop")


def main():
    with (DESKTOP_PATH / "Geo_information.csv").open(
        "w", encoding="utf-8"
    ) as out_file:
        for path in (DESKTOP_PATH / "Bilder_Sm").iterdir():
            if path.is_file() and path.suffix.lower() in [".jpg", ".jpeg"]:
                with path.open("rb") as file:
                    out_file.write(path.name + "\n")
                    tags = exifread.process_file(file)
                    for key in ["GPS GPSLatitude", "GPS GPSLongitude"]:
                        value = tags.get(key)
                        if value is not None:
                            out_file.write(f"{key}: {value}\n")


if __name__ == "__main__":
    main()
Was hier noch falsch ist: Die Dateiendung der Ausgabedatei, denn das ist gar keine CSV-Datei. Die würde man dann auch mit Hilfe des `csv`-Moduls aus der Standardbibliothek schreiben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Mike525xia
User
Beiträge: 2
Registriert: Donnerstag 4. August 2022, 11:06

Hallo zusammen,

vielen Dank _blackjack_. Ich habs inzwischen geschafft und den Fehler selbst beheben können. Ich weiß das der Code bestimmt nicht der beste ist aber bin noch nicht lange im Python-Geschäft:).

Danke nochmal für die Rückmeldung.

Viele Grüße
Antworten