2016-11-28 3 views
0

저는 Python을 처음 사용하고 교과서와 StackOverflow를 가르쳐 왔습니다. 나는이 사이트에서 실제 사례를 통해 가장 잘 배우는 것처럼 보인다. 나는 현재의 문제로 누군가 나를 도울 수 있기를 바라고있다.반복적으로 (또는 재귀 적으로) 필터 디렉토리와 결과를 새 디렉토리에 복사

약 1,000 개의 파일이있는 디렉토리 (폴더)가 있습니다. 파일의 이름은 aaa_*, bbb_*, ccc_*과 같은 접두사 (패턴)가 있습니다. 내가 디렉토리를 반복하고 지정된 접두사가있는 모든 파일을 복사하고 그 접두사 이름으로 새 디렉토리로 이동하고 싶습니다. 예를 들어, aaa_* 파일을 모두 /my_dir_path에 찾아서 /my_new_dir_path/aaa에 복사하고 마찬가지로 모두 bbb_*/my_new_dir_path/bbb에 복사합니다. 새 디렉토리가 이미 작성되었습니다.

다음의 간단한, 보일러는, 스크립트는 새 디렉토리에 접두사 패턴 중 하나를 복사 작동 : 내가 고민하고있어 반복적으로 다음 패턴과 내 목록 fnmatch.filter을 실행하는 방법입니다

dir = '/my_dir_path' 
pattern = 'aaa_*' 
dest = '/my_new_dir_path/aaa' 

for root, dirs, files in os.walk(dir): 
    for filename in fnmatch.filter(files, pattern): 
     source = (os.path.join(root, filename)) 
     shutil.copy2(source, dest) 

궁극적으로 파일을 자신의 디렉토리에 출력합니다.

나는 패턴 목록이 *args으로 여러 가지 다른 함수 정의를 작성하려고했지만 일반적으로 "filter()는 정확히 2 개의 인수 (3 개)가 필요합니다"라는 오류 메시지가 표시됩니다. (나는 여기에 당신을 보여줄 코드 예제가 없다는 것에 대해 사과한다. 지난 며칠 동안 나는 많은 대표적인 함수 정의가 없다는 것을 여러 버전 경험했다.)

나는 초심자 다. fnmatch.filter을 재귀 적으로 만들 수 있는지 또는 대체 전략을 고안 할 수 있는지 여부는 알지 못합니다. 그런 다음 각 패턴 검색에서 결과 파일을 자체 디렉토리에 저장하는 방법의 문제점이 있습니다. 내가, 예를 들어, 내가 미리 사전을 만들 수

my_dict = {'my_new_dir_path/aaa': 'aaa_*', 'my_new_dir_path/bbb': 'bbb_*'} 

생각하고 저장 결과 파일을 적절한 키 아래 값으로,하지만 난 경우에도 작동하도록 재귀를 확보하지 않은 것을 주어졌다 (즉, 인쇄) 나는 결과를 새로운 디렉토리에 복사하는 방법에 대해 연구하지 않았다.

+0

재귀에서 원하는 결과가 확실하지 않습니다. 파일을 여러 단계로 이동 하시겠습니까? 공통 접두사로 디렉토리의 이름을 바꿉니 까? – Prune

+0

원래 디렉토리에는 aaa_1, aaa_2, aaa_n, bbb_4, bbb_6, bbb_7 등의 파일이 있습니다. 'aaa_ *'인 모든 파일을 분리하고 'aaa'라는 폴더로 복사/이동 한 다음 모든 'bbb_ *'를 'bbb'라는 폴더로 옮깁니다. 새로운 디렉토리 (aaa, bbb 등)가 이미 생성되었습니다. – user69339

답변

0

이제 테스트 할 파일이 모두 없으므로 테스트하지 않았습니다. 그러나 필자는 "패턴"변수를 목록으로 만들고 다른 for 루프를 추가합니다. 또한 "dest"변수를 변경하여 "패턴"목록을 활용할 수 있습니다.

dir = '/my_dir_path' 
patterns = ['aaa', 'bbb', 'ccc'] 
dest = '/my_new_dir_path/' 

for root, dirs, files in os.walk(dir): 
    for pattern in patterns: 
     for filename in fnmatch.filter(files, pattern+'_*'): 
      source = (os.path.join(root, filename)) 
      shutil.copy2(source, dest+pattern+'/') 
+0

감사합니다. 두 번째 for 루프는 반복을 완료했습니다. (나는 두 번째 for 루프로이 프로세스를 시작했기 때문에 벽에 머리를 두드리는 중이다. 이제는 내 오류를 만든 곳을 볼 수있다.) 이제 모든 'a-files'을 격리하고 자신의 것으로 복사한다. dir (.../aaa) 그리고 'b-files'-> (.../bbb) 등에서 같은 작업을 수행합니다. 현재 모든 파일이 단일 디렉토리에 복사됩니다. 나는 일련의리스트 나 dict에 "for filename"루프의 결과를 저장할 필요가있어서 각 반복을 자체 dir에 복사 할 수 있어야한다고 생각합니다. 이제 그 코드로 작업하겠습니다. 기꺼이 제안을 받아 들일 것입니다. 다시 한번 감사드립니다. – user69339

+0

죄송합니다. 제 코드에서 실수를 수정했습니다. 원래, 나는 마지막 줄을'shutil.copy2 (source, dest + 'pattern')'이라고 불렀다. 이것은 모든 파일을 "destination"이라는 디렉토리에 넣었다."이제는 ('shutil.copy2 (source, dest + pattern + '/')') 그 라인은 파일을 자신의 디렉토리에 두어야합니다. 현재 디렉토리에있는"patterns "리스트의 반복입니다. 나는 패턴 목록에서 "_ *"을 사용하지 않으므로 대상 디렉토리의 일부로도 사용할 수 있습니다. 또한 좋은 측정을 위해 + /를 추가했습니다. –

+1

당신의 도움에 크게 감사드립니다. 어젯밤에 두드리기 전에 + '/'를 추가해야한다는 것을 알았지 만 'pattern'(문자열) 오류를 알아 채지 못했습니다. 다양한 코드 버전으로 작업을 계속했지만 모두 동일한 오류가 발생했습니다. 패턴을 문자열로 취급하고 있습니다.이 실수를 파이썬 오류 점검 목록에 추가하여 코드 문제를 해결할 때 찾아 보았습니다. 학습 기회와 시간을 많이 주셔서 다시 한 번 감사드립니다. – user69339