Обработка списка элементов с нескольких дисков

#python

Вопрос:

У меня есть список кортежей, который выглядит так, как показано на рисунке ниже. Я передаю список в функцию python для обработки каждого элемента в списке. Мне нужно получить доступ к нескольким системным дискам, чтобы обработать список. Моя текущая программа каждый раз открывает дисковод. Это неэффективно. Я хочу открыть диск только в том случае, если текущий элемент в списке находится на диске, отличном от последнего обработанного элемента.

 (1, 18911232, 'af1a83d6b18bf3e065be82cf44246037', 'D')
(2, 18911744, 'd5cedca078545cbcb0b2a9b514f9b92d', 'D')
(3, 18912256, '457ee2f5dc6f95b09599fc3f479878b6', 'D')
(4, 27076608, '8fb1ee8d6d8df00e53055e0eb48ef2e5', 'E')
(5, 27077120, 'a9ea5ccfebe4d6b3ecdd429518fff688', 'E')
(6, 27077632, 'ff722e8bb3c731ece625f882a090f100', 'E')
(7, 19604324352, 'd1fd613c04c983d73d79027f2a3425f9', 'C')
(8, 19604324864, '6f51f480b2ad733f20a54c8d3f5dd38c', 'C')
(9, 19604325376, '066fdaddf301b83402934e5783a3eec3', 'C')

 
 def check(oldList):
    newList = []#To hold processed list
    try:
        for item in oldList:
            drive = item[3]
            volume = r"\."   '\'  drive   ':' #Constructing string to open the drive.                  
            with open(volume, 'rb') as disk: #Open drive
                disk.seek(item[2])#Move to sector address on disk
                sector_data = disk.read(512) #Read sector data (512 bytes)
                sectorHash = md5HashFunc(sector_data)#Hash sector data
                if sectorHash==item[3]:  
                    pass #If data matches, do nothing - sector still intact
                else:
                    newList.append(item[1])
    except Exception as err:
        logging.exception(err)
        logging.info('=======================================================n')
        notificationMessage('An error occured and has been logged, see log for details.')
    return newList #Return new list.
 

Комментарии:

1. Пожалуйста, не включайте скриншоты текста.

Ответ №1:

хотите открыть диск только в том случае, если текущий элемент в списке с другого диска, чем последний обработанный элемент

Сохраните последний просмотренный диск, затем проверьте, изменяется ли он по мере выполнения цикла

Например

 drive = None
prevDrive = None
disk = None
for item in oldList:
    drive = item[3]
    if drive != prevDrive
        volume = r"\."   '\'  drive   ':'
        if disk is not None:  # if previously assigned
            disk.close()
        disk = open(volume, 'rb')
    
    # do work
    disk.seek(item[2])

    prevDrive = drive
if disk is not None:
    disk.close()
 

Однако это будет работать только для относительно отсортированного списка дисков.

Альтернативой является хранение словаря дескрипторов файлов

 drive_map = {item[3]: open(r"\."   '\'  item[3]   ':', 'rb') for item in oldList}
for item in oldList:
    disk = drive_map[item[3]]
    # do work
    disk.seek(item[2])
     
# make sure to close all the files when done
for _, f in drive_map.items():
    f.close()
 

Также не уверен, почему вы проверяете, что хэш сектора равен значению диска, поскольку хэши обычно не состоят из одного символа