#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()
Также не уверен, почему вы проверяете, что хэш сектора равен значению диска, поскольку хэши обычно не состоят из одного символа