2013-04-29 5 views
0

Im делает небольшую программу на python для копирования некоторых файлов. Мои имена файлов находятся в списке «selectedList».Скопировать файлы из списка Python

Пользователь выбрал источник "self.DirFilename" и пункт назначения "self.DirDest".

Я использую cp вместо shutil, потому что я читал, что затвор медленный.

Heres мой код:

for i in selectedList: 
    src_dir = self.DirFilename + "/" + str(i) + ".mov" 
    dst_dir = self.DirDest 
    r = os.system('cp -fr %s %s' % (src_dir, dst_dir)) 
    if r != 0: 
     print 'An error occurred!'** 

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

Любые предложения были бы полезными (как и любые очевидные ошибки, которые я делаю) - моя первая программа на питоне, и я почти там!

Благодаря Gavin

+1

Чтобы избежать проблем и проблем безопасности с забавными неэкранированных символов (например, пробел), сделайте следующее: 'г = subprocess.call (('ф', '-fr', src_dir, dst_dir + '/')) ' – pts

+0

FYI' shutil' медленный для копирования, потому что его размер буфера составляет всего 16K. Большой размер буфера может иметь большое значение, в соответствии с несколькими источниками (например, http://blogs.blumetech.com/blumetechs-tech-blog/2011/05/faster-python-file-copy.html). Для рекурсивных копий изменить размер буфера 'shutil' непросто. См. Ссылку выше для альтернативной реализации. Вероятно, огромная разница связана с различными шаблонами поиска дисков. – pts

+0

Это не очевидно для меня, что вопрос здесь. – pts

ответ

0

Я думаю, что что-то подобное может сделать трюк. Конечно, вы можете захотеть использовать что-то заранее, чтобы os.system вызывать cp.

import os 

for r, d, f in os.walk(self.DirFilename): 
    for file in f: 
     f_name, f_ext = os.path.splitext(file) 
     if ".mov" == f_ext: 
      if f_name in selectedList: 
       src_abs_path = os.path.join(r, file) 
       src_relative_path = os.path.relpath(src_abs_path, self.DirFilename) 
       dst_abs_path = os.path.join(self.DirDest, src_relative_path) 
       dst_dir = os.path.dirname(dst_abs_path) 
       if not os.path.exists(dst_dir): 
        os.makedirs(dst_dir) 
       ret = os.system('cp -fr %s %s' % (src_abs_path, dst_abs_path)) 
       if ret != 0: 
        print 'An error occurred!' 
+0

Спасибо Zuljin, Это сработало, но только для первого элемента в списке. Ваш код немного продвинулся для меня, я собираюсь потратить некоторое время, чтобы понять это. Спасибо за вашу помощь. –

+0

После того, как я понял ваш код, я нахожу одну проблему. Он отлично работает для меня, но затем застревает после копирования 1 файла.Я получаю эту ошибку: –

+0

Traceback (самый последний вызов последнего): Файл "/Users/gavinhinfey/Desktop/ALEXAFROMEDL.py", строки 119, в DoTheCopy src_abs_path = os.path.join (г, файл) Файл «/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py», строка 77, в соединении elif path == '' или path.endswith ('/'): AttributeError : 'int' объект не имеет атрибута 'endswith' –

0
import glob 
for fname in selectedList: 
    filename = str(fname) + '.mov' 
    found = glob.glob(os.path.join(self.DirFilename, filename)) 
    found.extend(glob.glob(os.path.join(self.DirFilename, '**', filename))) 
    found = [(p, os.path.join(self.DirDest, os.path.relpath(p, self.DirFilename))) for p in found] 
    for found_file in found: 
     # copy files however 
     #r = os.system('cp -fr %s %s' % found_file) 
+0

found = [(p, os.path.join (self.DirDest, os.path.relpath (p, self.DirFilename))) для p в найденном] ^ SyntaxError: недействительный синтаксис –

+0

Спасибо за помощь –

+0

@GavinHinfey odd, я не получаю синтаксическую ошибку. С какой частью он жалуется? – cmd

Смежные вопросы