Python IOError 102 в os.listdir()

Я сделал скрипт, который отобразит мне каталог и даст мне статистику по нему... Вот скрипт:

import os 
import hashlib
import platform
import sys
import argparse
import HTML

class Map(object):

    def __init__(self,param):
        self.param_list = param
        self.slash = self.slash_by_os()
        self.result_list = []
        self.os = ""


    def calc_md5(self,file_path):
        with open(file_path) as file_to_check:
            data = file_to_check.read()    
            md5_returned = hashlib.md5(data).hexdigest()

        return md5_returned

    def slash_by_os(self):
        general_id = platform.system()
        actual_os = ""

        if general_id == "Darwin" or general_id == "darwin":
            actual_os = "UNIX"
        elif general_id == "Linux" or general_id == "linux":
            actual_os = "UNIX"
        elif general_id  == "SunOS":
            actual_os = "UNIX"
        elif general_id == "Windows" or general_id == "windows":
            actual_os = "WIN"
        else:
            actual_os = general_id

        if actual_os == "UNIX":
            return '/'
        elif actual_os == "WIN":
            return '\\'
        else:
            return '/'

        self.os = actual_os

    def what_to_do(self,new_dir):
        act = []
        act.append(new_dir[:-1])
        for param in self.param_list:
            if param == "md5":
                x = self.calc_md5(new_dir[:-1])
                act.append(x)
            elif param == "size":
                x = os.stat(new_dir[:-1]).st_size
                act.append(x)
            elif param == "access":
                x = os.stat(new_dir[:-1]).st_atime
                act.append(x)
            elif param == "modify":
                x = os.stat(new_dir[:-1]).st_mtime
                act.append(x)
            elif param == "creation":
                    x = os.stat(new_dir[:-1]).st_ctime
                    act.append(x)   

        return act

    def list_of_files(self ,dir_name ,traversed = [], results = []): 

        dirs = os.listdir(dir_name)
        if dirs:
            for f in dirs:
                new_dir = dir_name + f + self.slash
                if os.path.isdir(new_dir) and new_dir not in traversed:
                    traversed.append(new_dir)
                    self.list_of_files(new_dir, traversed, results)
                else:
                    act = self.what_to_do(new_dir)
                    results.append(act)
        self.result_list = results  
        return results


def parse_args():
    desc = "Welcom To dirmap.py 1.0"
    parser = argparse.ArgumentParser(description=desc)
    parser.add_argument('-p','--path', help='Path To Original Directory', required=True)
    parser.add_argument('-md','--md5', action = 'store_true',help='Show md5 hash of file', required=False)
    parser.add_argument('-s','--size', action = 'store_true', help='Show size of file', required=False)
    parser.add_argument('-a','--access', action = 'store_true',  help='Show access time of file', required=False)
    parser.add_argument('-m','--modify', action = 'store_true', help='Show modification time of file', required=False)
    parser.add_argument('-c','--creation', action = 'store_true', help='Show creation of file', required=False)

    args = vars(parser.parse_args())

    params = []
    for key,value in args.iteritems():
        if value == True:
            params.append(key)

    return args,params



def main():
    args , params = parse_args() 
    dir_path = args['path']
    map = Map(params)
    dir_list = map.list_of_files(dir_path)

    params.insert(0,"path")


    htmlcode_dir = HTML.table(dir_list,header_row=params)
    print htmlcode_dir

main()

и во время работы в linux env я получаю эту трассировку:

MacBook-Pro:Скрипты Python Daniel$ python dirmap.py -p / -md -s -a -m -c >> 1.html Трассировка (последний последний вызов): файл "dirmap.py", строка 132, в основном () Файл "dirmap.py", строка 124, в основном dir_list = map.list_of_files(dir_path) Файл "dirmap.py", строка 89, в list_of_files act = self.what_to_do(new_dir) Файл "dirmap.py", строка 61, в what_to_do x = self.calc_md5(new_dir[:-1]) Файл "dirmap.py", строка 25, в calc_md5 с open(file_path, 'rb') как file_to_check: IOError: [Errno 102] Операция не поддерживается в сокете: '/.dbfseventsd'

Как я могу решить мою проблему?? Спасибо !


person Fernando Retimo    schedule 30.08.2013    source источник


Ответы (1)


Проблема в том, что open() работает через сокеты при сканировании различных файлов. Вы должны решить эту проблему с помощью try/catch, перехватив IOError. Пример:

try:
    with open(file_path) as file_to_check:
        data = file_to_check.read()    
        md5_returned = hashlib.md5(data).hexdigest()
except IOError as ioe:
    print "Failed: " + str(ioe)

Но это уловит ВСЕ ошибки ввода-вывода, а не только сокеты. Если вы хотите, чтобы сообщение об ошибке обрабатывало этот конкретный сценарий, вам нужно проверить, является ли это сокетом, прежде чем пытаться его открыть. См. это о том, как проверить, является ли файл сокетом.

Кроме того, я заметил, что вы вручную проверяете платформу, для которой следует использовать разделитель файлов. Он встроен как os.path.sep. Ознакомьтесь с python os.path модуль для более независимых от платформы способов обхода файловых систем.

person Windward Geek    schedule 05.04.2014