Фильтр Python 3 из непонятного словаря для LTO Tape Archive - PullRequest
0 голосов
/ 22 мая 2018

Я довольно новичок в Python, поэтому, пожалуйста, извините за недостаток знаний.

В настоящее время я работаю над фильтром для ленточных архивов.Из библиотеки ленточных носителей я получаю длинный список csv с несколькими столбцами, такими как «Path, Media, MD5 и т. Д.».

Я написал небольшой скрипт-фильтр, чтобы считывать только файлы, записанные на ленте.(все ленты начинаются с буквы K и записаны в столбце «Медиа»)

from tkinter import *
from tkinter.filedialog import askopenfilename

def callback():
 filename = askopenfilename()
# print(filename)
  return filename


errmsg = 'Error!'
Button(text='File Open', command=callback).pack(fill=X)

inputfile = callback()

import csv

def tapefilter():
with open(inputfile, 'r') as csvfile:
    reader = csv.DictReader(csvfile)

    for row in reader:
        if 'K' in row['Media'] and 'DT' in row['Path']:
            x = row['Path']
            x = x.replace("/Backups","")
            x = x.replace("/Volumes/", "")
            x = x.split("/")
            yield x

def output():
for x in tapefilter():
    print(x[0], x[2])

output()

Теперь я получаю

K00130 20170504_DT12
K00130 20170505_DT13
K00130 20170508_DT14
K00130 20170508_DT14_part02
K00130 20170511_DT17
K00130 20170508_DT14_part03
K00130 20170508_DT14_part03
K00130 20170508_DT14_Masterfiles
K00130 20170508_DT14_part03
K00130 20170508_DT14_part03
K00130 20170508_DT14_part03
K00130 20170508_DT14_Masterfiles
K00130 20170508_DT14_part03
K00130 20170508_DT14_part03
K00130 20170508_DT14_part03
K00131 20170508_DT14_part03
K00131 20170508_DT14_part03
K00131 20170508_DT14_part03

Мне нужен фильтр, который выводит тольконазвание ленты и строки, которые отличаются.Таким образом, либо номер ленты меняется, либо что-то в этой конкретной части пути (весь путь намного длиннее).

"/Volumes/K00131/Backups/Testproject/20170518_DT22/Alexa_ProRes/A032R72N",K00131,".cardmeta.xml"

Все сценарии фильтра, которые я нашел до сих пор, всегда выбрасывают «не хашущиеся» ошибки.

В конце все должно выглядеть так:

K00130 20170504_DT12
K00130 20170505_DT13
K00130 20170508_DT14
K00130 20170508_DT14_part02
K00130 20170511_DT17
K00130 20170508_DT14_part03
K00130 20170508_DT14_Masterfiles
K00131 20170508_DT14_part03

Я немного застрял: /

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 22 мая 2018

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

def tapefilter():
    with open(inputfile, 'r') as csvfile:
        reader = csv.DictReader(csvfile)
        prev_values = [] # <- keep a list of previous (unique) values
        for row in reader:
            if 'K' in row['Media'] and 'DT' in row['Path']:
                x = row['Path']
                x = x.replace("/Backups", "")
                x = x.replace("/Volumes/", "")
                x = x.split("/")
                if (x[0], x[2]) in prev_values:
                    continue # <- don't yield if we've already seen this row
                else:
                    prev_values.append((x[0], x[2])) # <- update prev_values
                    yield x

Результаты:

K00130 20170504_DT12
K00130 20170505_DT13
K00130 20170508_DT14
K00130 20170508_DT14_part02
K00130 20170511_DT17
K00130 20170508_DT14_part03
K00130 20170508_DT14_Masterfiles
K00131 20170508_DT14_part03
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...