2012-04-10 1 views
0

I 나는 다시 쓰기 반환 (정말 .zip으로되어있다) .pencast 파일에서 AAC 파일을 추출하는 bash는 스크립트 ...이 아닌 고유 한 파일 이름으로 파일을 압축 해제하는 방법

import os 
import glob 
import zipfile 

app_path = os.path.dirname(os.path.realpath(__file__)) + os.sep 
temp = app_path + 'AudioFiles' 

for pencast in (glob.glob(app_path + '*.pencast')): 
    f = zipfile.ZipFile(pencast, 'r') 
    for number, audio in enumerate(f.namelist()): 
     if 'aac' in audio: 
      print(os.path.basename(pencast), number, audio) 

을 (! 그래서 당신은

) 파일 모양을 볼 수있다 : I는 각 파일의 압축을 풀 수있는 방법을

Cancer1-1.pencast 29 userdata/Sessions/PRS-a6959094a/audio-0.aac 
Cancer1-1.pencast 32 userdata/Sessions/PRS-a695732e5/audio-0.aac 
Cancer1-2.pencast 30 userdata/Sessions/PRS-a696fa7ab/audio-0.aac 
Cancer1-2.pencast 33 userdata/Sessions/PRS-a699046df/audio-0.aac 
Cancer1-3.pencast 32 userdata/Sessions/PRS-a699046df/audio-0.aac 
Cancer1-3.pencast 35 userdata/Sessions/PRS-a696fa7ab/audio-0.aac 

pencast.py/usr/지방/빈/python3, 그것을

즉 고유 한 이름을 지정
Cancer1-1-1.aac 
Cancer1-1-2.aac 
Cancer1-2-1.aac 

... 오디오 파일을 'AudioFiles'폴더로 옮겼습니까?

+0

'afconvert'는 무엇을합니까? –

+0

afconvert는 형식간에 오디오 파일을 변환하기위한 명령 줄 도구입니다. 펜 캐스트 파일에 저장된 aac 파일은 iTunes에서 읽을 수 없으므로 mp4f – beoliver

+0

으로 변환해야합니다. "파일을 덤프"한다는 것은 무엇을 의미합니까? * name * 파일 또는 압축 해제 된 파일 * contents *? zip 아카이브 등의 디렉토리 구조를 평탄화하고 싶습니까? –

답변

1

먼저 경로를 결합하려면 os.path.join을 사용하십시오. 이 같은

그리고 시도 뭔가 :

import os 
import glob 
import zipfile 

def is_audio(file): 
    return 'acc' in file 

app_path = os.path.dirname(os.path.realpath(__file__)) 
os.chdir(app_path) 
try: 
    os.mkdir('AudioFiles') 
except OSError: 
    pass 

for pencast in (glob.glob('*.pencast')): 
    f = zipfile.ZipFile(pencast, 'r') 
    for number, audio in enumerate(filter(is_audio, f.namelist())): 
     basename = os.path.basename(os.path.splitext(pencast)[0]) 
     newfilename = '{}-{}.acc'.format(basename, number) 
     print(newfilename, number, audio) 
     f.extract(audio, os.path.join('AudioFiles', newfilename)) 

내가 코드를 시도하지 않았다, 그것은 오류가있을 수 있습니다,하지만 난 당신이 포인트를 얻을 것 같아요.

+0

나는'def is_audio (file) :'에 익숙하지 않지만 어떻게해야하는지 알 수있다. 나는 또한'filter' ->'enumerate (filter (is_audio, f.namelist()))'를 사용하는 것에 익숙하지 않다. 이것은 아무것도 반환하지 않는 것 같습니다. – beoliver

+1

@ user969617 with def is_audio (file)'file 매개 변수에 하위 문자열 'acc'가 있으면 True를 반환하는 is_audio라는 함수를 선언하고 있습니다. 기본적으로 나는'lambda'를 인라인 대신에 더 명확하게 만들기 위해 조건을 옮겼습니다. 'filter (is_audio, f.namelist())'는'is_audio'가 True를 반환하도록하는'f.namelist()'항목의 목록을 반환합니다. 그것은 당신의 내면의'if '를 대체하고 나를 구원의 장소로 만듭니다. – KurzedMetal