2012-04-10 3 views
0

Я переписывание Баш скрипт, который извлекает файлы из Aac .pencast файлов (которые на самом деле просто .zip) ...Как распаковать файлы с неоднородными именами файлов

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) 

, который возвращает (так что вы можете увидеть, что файлы похожи)

:/USR/местные/бен/python3 pencast.py

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 

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

Cancer1-1-1.aac 
Cancer1-1-2.aac 
Cancer1-2-1.aac 

... и есть только аудиофайл, перемещенный в папку AudioFiles?

+0

Что делает 'afconvert'? –

+0

afconvert - это инструмент командной строки для преобразования аудиофайлов между форматами. файлы aac, которые сохраняются в файлах pencast, не могут быть прочитаны itunes, поэтому их нужно преобразовать в mp4f – beoliver

+0

Хорошо, и что вы подразумеваете под «сбрасывает файл»? Файл * имя * или распакованный файл * содержимое *? Вы хотите, чтобы вы сгладили структуру каталогов 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 с 'def is_audio (файл)' Я объявляю функцию с именем 'is_audio', которая возвращает' True', если параметр 'file' имеет подстроку' 'acc''. В основном я просто переместил условие, чтобы сделать его более понятным, вместо того, чтобы использовать 'lambda' inline. 'filter (is_audio, f.namelist())' возвращает список элементов 'f.namelist()', которые возвращают 'is_audio' True. Он заменяет ваш внутренний 'if' и сохраняет меня, чтобы сделать счетчик. – KurzedMetal

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