Seite 1 von 1

kompatilität OSX und Rasperian (scandisk / stat)

Verfasst: Mittwoch 23. Oktober 2019, 21:19
von ChristophS
Guten Abend liebe Gemeinde

Ich suche Files mit os.scandisk auf OSX und dem Raspberry. Das funktioniert auch wunderbar.
Sobald ich den Status mit os.stat abrufe geht es mit OSX, mit Rasperian aber nicht.

Code: Alles auswählen

import datetime
from os import scandir, stat

found = 0
path = ''
size = 0
scaned = 0


def scantree(path):

    for entry in scandir(path):
        if entry.is_dir(follow_symlinks=False):           
            yield from scantree(entry.path) 
        else:
            yield entry

        
if __name__ == '__main__':
    import sys
    try:
        for entry in scantree('/users'):
            scaned += 1
            if entry.name.endswith('pdf'):
                found += 1
                status = stat(entry.path)
                created = datetime.datetime.fromtimestamp(status.st_birthtime)
                modified = datetime.datetime.fromtimestamp(status.st_mtime)
                size += status.st_size /1000000                
                print(entry.path, ' ', entry.name, ' ', int(status.st_size/1000), 'KB created: ', created , ' modified: ', modified)
    except:
        scaned += 1
        
    print('Anzahl Files gesamt: ' , scaned)
    print('Anzahl Gefunden: ', found)
    print('Speicherbedarf: ', int(size), 'MB')
Auf beiden System benutze ich Python 3.5

An was kann das liegen?

Christoph

Re: kompatilität OSX und Rasperian (scandisk / stat)

Verfasst: Mittwoch 23. Oktober 2019, 21:30
von nezzcarth
Poste doch bitte die konkrete Fehlermeldung, die Python ausgibt, damit man dir weiterhelfen kann. Und meinst du vielleicht Raspbian?

Re: kompatilität OSX und Rasperian (scandisk / stat)

Verfasst: Mittwoch 23. Oktober 2019, 21:35
von Sirius3
Was heißt „funktioniert nicht”? Wie lautet die Fehlermeldung?
Dazu mußt Du erst einmal die unsinnige „Fehlerbehandlung” entfernen.

Warum verwendest Du `os.stat` wo doch `entry` schon ein stat-Attribut hat.
Statt der low-level-Funktionen von `os` gibt es `pathlib`, das Dein scantree überflüssig macht.

Variablen sollten dann initialisiert werden, wenn am sie braucht und nicht 15 Zeilen davor auf einer anderen logischen Ebene.

Alles was unter `if __name__ == '__main__': steht sollte in eine Funktion namens `main` wandern.

So könnte das aussehen:

Code: Alles auswählen

import datetime
from pathlib import Path

def main():
    size = 0
    found = 0
    for entry in Path('/users').rglob('*.pdf'):
        found += 1
        status = entry.stat()
        size += status.st_size
        created = datetime.datetime.fromtimestamp(status.st_ctime)
        modified = datetime.datetime.fromtimestamp(status.st_mtime)
        print("{}: {}KB created: {}, modified: {}".format(entry, status.st_size // 1000, created, modified))
    print('Anzahl Gefunden: ', found)
    print('Speicherbedarf: {}MB'.format(size // 1000000))

if __name__ == '__main__':
    main()

Re: kompatilität OSX und Rasperian (scandisk / stat)

Verfasst: Mittwoch 23. Oktober 2019, 22:01
von ChristophS
Herzlichen Dank

Ich hoffte auf eine Antwort von Dir. Nicht nur weil Du immer sehr kompetent antwortest, sondern weil Du immer auch die 'Fehler' im Code ansprichst. Dafür bin ich dankbar, nur so bringt es mich weiter.
Path kannte ich nicht, DuckDuck hat das verschwiegen.

Nun muss ich noch ein klein wenig in Deinen Code investieren, damit ich weiss was ich mache.

Christoph