2013-04-29 5 views
0

Im 일부 파일을 복사하는 작은 파이썬 프로그램 만들기. 내 파일 이름이 "selectedList"목록에 있습니다.목록에서 파일 복사 Python

사용자가 소스 디렉토리 "self.DirFilename"을 선택하고 대상 디렉토리를 "self.DirDest"로 선택했습니다.

나는 shutil이 느리다고 읽었 기 때문에 shutil 대신에 cp를 사용하고 있습니다.

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!'** 

.

모든 제안은 도움이 될 것입니다. (내가하고있는 모든 명백한 실수와 마찬가지입니다.) - 내 첫 번째 파이썬 프로그램이며 거의 다 왔어!

감사 개빈

+1

는 이렇게'R = subprocess.call (('CP', '-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

추적 (최근 호출 마지막) : DoTheCopy의 "/Users/gavinhinfey/Desktop/ALEXAFROMEDL.py"파일 119 행src_abs_path = os.path.join (r, file) 파일 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", 라인 77, 가입 elif 경로 == ''또는 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

발견 = (p, os.path.join (self.DirDest, os.path.relpath (p, self.DirFilename))) P에 대한 발견] ^ 구문 에러 잘못된 구문 –

+0

도움을 주셔서 감사합니다 –

+0

@GavinHinfey 홀수, 구문 오류가 발생하지 않습니다. 그것에 대해 불평하는 부분은 무엇입니까? – cmd