Использование Python для сопоставления расширений split-RAR - PullRequest
2 голосов
/ 26 января 2012

Я использую скрипт Python в EventGhost для сопоставления файлов определенного типа в каталоге и перемещения их в определенные места, чтобы другие программы могли выполнять над ними действия. Вот весь сценарий:

import shutil
import os

SubFileTypes = ('sub','srt','txt')
ZipFileTypes = ('rar','zip','7z','r0')
MediaFileTypes = ('mkv','avi','mp4','wmv')
DownloadName = ''.join(eg.event.payload)
FileName = os.path.basename(DownloadName)
isFolder = os.path.isdir(DownloadName)
eg.globals.tvzip = 'J:\\DL\\TVzip\\'
eg.globals.tvzipdir = eg.globals.tvzip+FileName+'\\'
eg.globals.tvproc = 'J:\\DL\\TVProc\\'

if isFolder == True:
    os.mkdir(eg.globals.tvzipdir)
 #   print 'I\'m a folder!'
    for root, dirs, files in os.walk(DownloadName):
        for f in files:
            if f.endswith(ZipFileTypes):
                #print 'I\'m a zip file!'
                shutil.copy(os.path.join(root,f),eg.globals.tvzipdir)
            if f.endswith(SubFileTypes) or f.endswith(MediaFileTypes):
                #print 'I\'m a subtitle or media file!'
                shutil.copy(os.path.join(root,f),eg.globals.tvproc)

elif isFolder == False:
    shutil.copy(DownloadName,eg.globals.tvproc)
    eg.plugins.EventGhost.DisableItem(XmlIdLink(23))
#   print 'I\'m NOT a folder!'

else:
    print 'I dont know what I am!'

Конкретная проблема, с которой я сталкиваюсь, заключается в том, что мне нужна возможность сопоставлять каждое расширение .rX, полученное в формате split-rar. Эти расширения начинаются с r0 и могут заканчиваться неограниченным числом. Они как минимум "r + две цифры" (r00, r01, r02 и т. Д.), Но я думаю, что они могут быть выше двух цифр, хотя я не уверен.

Есть ли способ, которым я могу изменить свой список ZipFileTypes, чтобы включить эти расширения split-rar? Или есть другой способ?

Ответы [ 3 ]

1 голос
/ 26 января 2012

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

import re

# -snip-

    for f in files:
        if f.endswith(ZipFileTypes) or re.search(r'\.r\d+$', f):
            # do stuff

re.search() будет искать совпадения в любом месте строки, тогда как re.match() будетищите полное совпадение строк.В этом случае, поскольку нас интересует только расширение файла, мы будем использовать re.search().

Регулярное выражение имеет следующую структуру:

  • \.r -соответствует одному периоду, за которым следует r.\ для экранирования необходим, потому что . означает подстановочный знак в противном случае.
  • \d+ - соответствует любому количеству цифр.\d представляет цифру, + представляет «1+ предыдущего» * ​​1022 *
  • $ - соответствует концу строки.

Поместите их все вместе в \.r\d+$ и вы соответствуете расширению расщепления RAR.

0 голосов
/ 29 апреля 2013

При старой схеме именования разделенные архивы следуют следующему синтаксису:

.rar, .r00 - .r99, .s00 - .s99, .t00 - .z99,. {00 -.{99,. | 00 ...

Вы можете проверить это с помощью:

rar a -v0.1m -vn -m0 test.rar testfile

Windows выдаст ошибку при попытке создать архив .|00.Кроме того, это не имеет большого значения, потому что от .rar до .z99 есть 901 часть.Это никогда не должно быть достигнуто в обычных случаях.

Но я видел разделенные архивы с .s[xx], поэтому я рекомендую это регулярное выражение:

r'\.[r-z]{1}(([0-9]{2})|ar)$'

И для небольших улучшений скорости используйте этопуть:

import re

#some code

#compile the regex
reg_rar = re.compile(r'\.[r-z]{1}(([0-9]{2})|ar)$')
for root, dirs, files in os.walk(DownloadName):
    for f in files:
        if reg_rar.search (f) :
            #do sth
0 голосов
/ 26 января 2012

используйте регулярное выражение, я не знаю, как именно это сделать в python, но вы захотите сопоставить что-то вроде /.имена.

...