2017-10-03 2 views
0

Dies ist ein Skript der Suche nach Dateien, die größer als eine bestimmte Größe sind:Errno 2, während in Python mit os.walk

def size_scan(folder, size=100000000): 
    """Scan folder for files bigger than specified size 

    folder: abspath 
    size: size in bytes 
    """ 
    flag = False 

    for folder, subfolders, files in os.walk(folder): 
     # skip 'anaconda3' folder 
     if 'anaconda3' in folder: 
      continue 

     for file in files: 
      file_path = os.path.join(folder, file) 
      if os.path.getsize(file_path) > size: 
       print(file_path, ':', os.path.getsize(file_path)) 
       flag = True 

    if not flag: 
     print('There is nothing, Cleric') 

ich die folgende Fehlermeldung beim Scannen Stammordner in Linux:

Traceback (most recent call last): 

    File "<ipython-input-123-d2865b8a190c>", line 1, in <module> 
    runfile('/home/ozramsay/Code/sizescan.py', wdir='/home/ozramsay/Code') 

    File "/home/ozramsay/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 880, in runfile 
    execfile(filename, namespace) 

    File "/home/ozramsay/anaconda3/lib/python3.6/site-packages/spyder/utils/site/sitecustomize.py", line 102, in execfile 
    exec(compile(f.read(), filename, 'exec'), namespace) 

    File "/home/ozramsay/Code/sizescan.py", line 32, in <module> 
    size_scan('/') 

    File "/home/ozramsay/Code/sizescan.py", line 25, in size_scan 
    if os.path.getsize(file_path) > size: 

    File "/home/ozramsay/anaconda3/lib/python3.6/genericpath.py", line 50, in getsize 
    return os.stat(filename).st_size 

FileNotFoundError: [Errno 2] No such file or directory: '/run/udev/link.dvdrw' 

Ich vermute, es ist, weil Python-Interpreter nicht selbst scannen kann, also habe ich versucht, "Anaconda3" Ordner von der Suche zu überspringen (markiert durch # skip Anaconda Ordner im obigen Code). Die Fehlermeldung blieb jedoch gleich.

Kann jemand bitte erklären?

(Bitte lassen Sie mich wissen, wenn diese Art von Fragen hier nicht erlaubt ist und bearbeitet werden soll. Danke)

+0

Nun, vielleicht sollten Sie uns zeigen, in welchem ​​Ordner Sie diese Funktion ausführen. Es sieht so aus, als ob Sie es über einige spezielle Ordner laufen lassen (ist es normal, dass '/ run/udev /' auch gescannt wird?) – zezollo

+0

'/ run/udev/link.dvdrw' ist etwas mit einem DVD-Laufwerk zu tun (vielleicht ein Symlink?). Vielleicht führen Sie ['os.path.isfile'] (https://docs.python.org/3/library/os.path.html#os.path.isfile) aus, bevor Sie den Pfad zu' getsize' übergeben. –

+0

zezollo, I führe diese Funktion im Root-Ordner von Linux Mint aus: size_scan ('/') –

Antwort

1

Die Datei Python versucht, die Größe bekommt mit os.stat(filename).st_size ist ein Link. Ein defekter Link ist ein Link, dessen Ziel entfernt wurde. Es ist ähnlich wie ein Internet-Link, der eine 404 gibt. Um dies in Ihrem Skript zu beheben, überprüfen Sie, ob es sich um eine Datei handelt (bevorzugt), oder verwenden Sie eine try/catch (nicht bevorzugt). Verwenden Sie os.path.isfile(file_path), um zu überprüfen, ob die Datei eine Datei und keine fehlerhafte Verknüpfung ist. Der Code sollte wie folgt aussehen:

def size_scan(folder, size=100000000): 
"""Scan folder for files bigger than specified size 

folder: abspath 
size: size in bytes 
""" 
flag = False 

for folder, subfolders, files in os.walk(folder): 
    # skip 'anaconda3' folder 
    if 'anaconda3' in folder: 
     continue 

    for file in files: 
     file_path = os.path.join(folder, file) 
     if os.path.isfile(file_path) and (os.path.getsize(file_path) > size): 
      print(file_path, ':', os.path.getsize(file_path)) 
      flag = True 

if not flag: 
    print('There is nothing, Cleric') 

Also, bevor es die Größe bekommt, überprüft er, ob die Datei wirklich da ist, alle Links folgen, um sicherzustellen, es existiert. Related SO post.

+0

Ja, es funktioniert, danke. Und besonderer Dank für die Bearbeitung der Frage! –

+0

Gern geschehen! Froh, dass ich Helfen kann! – Steampunkery