2017-11-06 16 views
1

비슷한 이름을 가진 파일이 해당 서브 디렉토리에 위치하도록 비슷한 이름과 하위 디렉토리가있는 여러 파일이 들어있는 디렉토리가 있습니다. 주어진 서브 디렉토리의 모든 .sdf 파일을 하나의 .sdf 파일에 연결하려고합니다. 나는이 프로그램을 실행할 때특정 디렉토리에서만 os.system() 사용

import os 
from os import system 
for ele in os.listdir(Path): 
    if ele.endswith('.sdf'): 
    chdir(Path + '/' + ele[0:5]) 
    system('cat' + ' ' + '*.sdf' + '>' + ele[0:5] + '.sdf') 

그러나, 연결된 파일이 원하는 하나의 원래 디렉토리에서 모든하여 .sdf 파일이 아닌 바로하여 .sdf 파일이 포함되어 있습니다. 하위 디렉토리의 파일 만 연결하도록 스크립트를 어떻게 변경합니까?

+0

코드 스 니펫에 일부 가져 오기가 누락되어 있습니다. 포함시킬 수 있습니까? – byxor

+0

업데이트했습니다. –

+0

일부 io plz 작성! – DRPK

답변

4

이것은 매우 서투른 방법입니다. chdir를 사용하는 것은 권장하고 system 중 하나 (사용되지 않거나 과잉 cat 전화) 나를 .sdf 파일을 필터링하는 glob.glob를 사용하여 순수 파이썬 구현을 제안, 한 각 파일을 읽고 큰 파일에 기록하자

되지 않는다 루프 전에 열 :

나는, 나뿐만 아니라 입력과 출력을 가지고 초래 두 번 스크립트를 실행하기 때문에, 다른 파일과 같은 디렉토리에 넣어 권하고 싶지 않다 계산하지 big_sdf_file 왼쪽
import glob,os 
big_sdf_file = "all_data.sdf" # I'll let you compute the name/directory you want 
with open(big_sdf_file,"wb") as fw: 
    for sdf_file in glob.glob(os.path.join(Path,"*.sdf")): 
     with open(sdf_file,"rb") as fr: 
      fw.write(fr.read()) 

.

이 접근법의 단점은 파일이 크면 메모리로 완전히 읽혀 문제가 발생할 수 있다는 것입니다. 이 경우, 대체하여

fw.write(fr.read()) 

:

shutil.copyfileobj(fr,fw) 

(shutil를 가져 오는 경우에 필요합니다). 따라서 전체 파일 읽기/쓰기 대신 패킷 복사가 가능합니다.

Path의 하위 디렉토리를 검색하여 하위 디렉토리 당 1 개의 큰 .sdf 파일을 만들지 만 제공되는 코드를 사용하는 방법이있을 것입니다. 시스템 명령이나 chdir을 사용하지 않는 경우 사용자의 요구에 쉽게 적응할 수 있어야합니다.