kompatilität OSX und Rasperian (scandisk / stat)

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
ChristophS
User
Beiträge: 52
Registriert: Montag 7. August 2017, 12:52

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
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

Poste doch bitte die konkrete Fehlermeldung, die Python ausgibt, damit man dir weiterhelfen kann. Und meinst du vielleicht Raspbian?
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
ChristophS
User
Beiträge: 52
Registriert: Montag 7. August 2017, 12:52

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
Antworten