In questo video, avremo un approccio diverso per ottenere un elenco di tutte le canzoni
per un particolare album o artista.
Quindi un problema con l'approccio precedente, che si basava sui nomi di file e directory, è che potresti non
avere una struttura di file così ben organizzata. E se prendi la tua musica da
fonti diverse, i nomi dei file potrebbero non usare lo stesso modello, per esempio.
Quindi, sebbene l'ultimo paio di video sia stato ottimo per dimostrare come lavorare con file
e directory,
questo non è necessariamente il modo migliore per raggiungere l'obiettivo originale, e quello era quello di popolare il
database musicale da una collezione di dischi.
Quindi, in questo video, leggeremo i tag ID3 dai file mp3 sul disco.
Ora per farlo, avremo bisogno di un generatore che restituirà il percorso completo e il nome di ogni file
mp3, quindi
questa è la tua sfida.
Bene, quindi la sfida è quella di creare un generatore che restituirà il nome
file completo di tutti i file mp3. Ora il generatore dovrebbe iniziare nella directory specificata, l'avvio, che
verrà fornito come argomento alla funzione generatore.
Ora i nomi dei file dovrebbero includere il percorso completo dalla directory iniziale specificata.
Quindi dovrebbe restituire un percorso relativo.
Ora è una buona idea rendere il tuo generatore un po 'più
generico, in modo che possa gestire i file con qualsiasi estensione.
Quindi passa l'estensione come secondo parametro a quella funzione.
Ora come extra opzionale,
è possibile rendere assoluti i percorsi in modo che specifichino il nome file dalla radice dell'unità o del volume.
Controlla la documentazione per il modulo OS se vuoi farlo.
Ora se non hai alcun file mp3 reale, puoi utilizzare la directory musicale dei video precedenti
e cercare i file emp3 anziché i file mp3.
Bene, questa è la sfida.
Vedi qui vai con esso.
Metti in pausa il video e torna quando sei pronto per esaminare la mia soluzione.
Bene, quindi la soluzione a questa sfida è molto simile a quella che abbiamo già fatto.
Quindi useremo il sistema operativo. walk up generator per percorrere le directory
dall'inizio, quindi filtreremo i file che corrispondono all'estensione.
Quindi creerò un nuovo
filem e lo chiamerò
mp3scan. py.
Inizieremo importando os. Importeremo fnmatch, quindi inizieremo -
prima creerò la nostra prima funzione - e chiameremo questa parentesi find_music inizio estensione
spazio virgola, fine parentesi e due punti.
Quindi digiteremo per percorso directory spazio virgola file spazio virgola in os. cammina, inizia tra parentesi, due
punti per il file in fnmatch. filtra i file spazio virgola, una
sola citazione. Quindi vogliamo punto stella, quindi vogliamo
parentesi graffe sinistra e destra, terminare una virgoletta singola o terminare la virgoletta singola, dovrei dire, due punti di
estensione del formato punto, dopo aver chiuso le due parentesi, parentesi giuste. Quindi cederemo,
os. sentiero. unisci, e tra parentesi, il
percorso del file spazio virgola e proviamo effettivamente questo. Quindi ho intenzione di digitare per
f, alla riga 11, in find_music e musica a virgoletta singola virgoletta singola spazio virgola emp3 virgolette
singole e quindi terminare le parentesi, le parentesi giuste. E in realtà vogliamo fare una stampa, tra parentesi, e alla fine di quella linea, ovviamente, abbiamo bisogno di due punti.
OK. Quindi, nel video precedente, abbiamo passato Asterix, il carattere jolly, come parte della stringa del parametro.
Quindi qui quello che ho fatto, è che ho deciso - questo era alla linea 7 - ha deciso di limitare il
formato includendo Asterix nel modello di filtro.
Ora immagino che potresti argomentare a favore e contro ogni approccio.
In questo caso, il chiamante non deve preoccuparsi del formato del modello: ho appena passato l'estensione
come argomento.
Tuttavia, significa che find_music non è flessibile come potrebbe essere. Consente solo di filtrare l'estensione del
file.
Ma hai già visto due diversi approcci al filtraggio.
Puoi scegliere quello che è più appropriato per la tua specifica applicazione.
Bene, quindi questo sta restituendo tutti i nomi dei file relativi alla nostra directory di lavoro corrente, quindi iniziano
tutti con la musica.
Ma se vogliamo percorsi assoluti, useremmo il sistema operativo. sentiero. funzione abspath.
Quindi proviamo a
eseguirlo prima, prima di farlo. Puoi vedere che stiamo ottenendo il nostro output lì. Funziona bene, quindi lo smetterò.
Quindi, parlando di percorsi assoluti,
come potremmo affrontarlo?
Bene, in realtà c'è una funzione che possiamo usare per questo.
Quindi quello che faremo dopo il ciclo for
o il file for in fnmatch. linea di filtro, metteremo, o dopo dovrei dire, absolute_path è uguale
a os. sentiero. abspath - path
assoluto è ciò che rappresenta - path, e quindi non abbiamo bisogno di cambiare affatto la riga successiva.
Quindi stiamo
creando, stiamo creando un
percorso
assoluto sulla linea 8 e quindi lo usiamo in valori resi.
Quindi andiamo avanti e cambiamo quello. Invece del
percorso ora - quello, ovviamente, dovrebbe essere il percorso assoluto. Quindi, se effettivamente eseguiamo questo solo per vedere che funziona. Vado in cima lì - puoi vedere che ho un percorso
abbastanza lungo sul mio Mac, ma puoi vedere
che, ovviamente, quel percorso sta funzionando. Ora abbiamo un percorso assoluto e l'albero di ogni file.
Quindi lo fermerò.
Bene, ora otteniamo il percorso completo di ogni file corrispondente e ciò potrebbe essere più utile se volessimo memorizzare
i percorsi in un database in modo che il nostro programma di riproduzione musicale potesse riprodurre i brani, ad esempio.
Notare come non abbiamo nemmeno creato esplicitamente un oggetto generatore.
Puoi semplicemente usare i tuoi generatori in un ciclo for e occuparti della creazione del generatore, mentre for
si occupa della creazione del generatore e della successiva chiamata successiva.
Ora, se hai creato l'oggetto generatore e ci sei passato sopra, va bene.
Quindi avresti potuto fare
qualcosa del genere: quindi my_music_files è uguale a find_music, musica
tra virgolette singole, spazio virgola ed emp3.
Quindi, se lo facessi in questo modo, sarebbe del tutto accettabile.
E ovviamente, se lo hai fatto in quel
modo, probabilmente hai cambiato il loop lì, quindi è per f in my_music_files. Possiamo farcela e, ovviamente, otteniamo lo stesso risultato.
Quindi, in sostanza, sto dicendo che va bene anche questo: otteniamo gli stessi risultati in ogni modo.
Bene, questa è la sfida completata.
Ora la ragione per creare quel generatore è che possiamo scorrere tutti i nostri file mp3
e ottenere i dettagli della canzone dai tag.
Ora, nel caso in cui non si abbia familiarità con tag e file musicali, in realtà sono in
che modo i lettori musicali sono in grado di visualizzare il titolo del brano, o anche un'immagine dell'album, della copertina dell'album.
Ora c'è un dettaglio standard dei tag ID3 utilizzati nei file mp3.
Quindi sto per aprire un browser.
Diamo solo una rapida occhiata.
Quindi questo sito Web contiene tutto ciò di cui hai bisogno, tutto ciò di cui hai bisogno se vuoi scrivere i tuoi
programmi per leggere e scrivere i tag.
Quindi, se vuoi farlo, leggi bene le informazioni su questo sito per
scoprire il formato dei dati, che alla fine dovrai affrontare.
Non approfondiremo il formato binario dei file mp3, ma una
domanda che ci viene posta spesso è: perché dobbiamo leggere e scrivere dati binari in Python.
Bene, leggere i tag ID3 dai file musicali è un esempio in cui dovresti farlo.
E in effetti, se uno qualsiasi dei tuoi file musicali mancasse di alcuni tag come l'artista o il titolo del brano, allora
potresti effettivamente utilizzare la tecnica precedente e tentare di elaborare i valori corretti dai nomi dei
file.
Il programma potrebbe quindi riscrivere i tag nel file con i file corretti aggiunti.
Ora lavorare con un formato di file binario per gestire i tag ID3 è
più complicato che difficile, ma fortunatamente Ned Batchelder ha creato un modulo Python 2 che fa
un
ottimo lavoro nel leggere i tag più comuni. Ora ci sono altre librerie Python, e la maggior
parte di esse ti permetterà anche di scrivere tag e di leggerli. Ora nel caso del modulo di Ned, leggerà solo i tag,
ma è una buona cosa perché non c'è possibilità di distruggere la tua raccolta musicale lavorando con questo video.
In altre parole, i tuoi file mp3 saranno aperti solo per la lettura, quindi saranno abbastanza sicuri.
Ora, se sei interessato al suo programma Python, id3reader. Py, inserirò anche il link in questo e puoi andare a prenderlo lì
- incollarlo come puoi vedere lì. Questo si carica. Ora se stai usando Python 2. 7, è possibile scaricare
il file dot py dal collegamento in quella pagina e copiarlo nella directory del progetto.
Ora purtroppo non funziona come Python 3.
Quindi quello che abbiamo fatto è che abbiamo effettivamente prodotto una versione di Python 3 dal codice originale di Ned.
Quindi, se stai usando
Python 3,
scarica id3reader sottolineatura p3. spunta dalla sezione risorse di questo video e inseriscilo nelle directory del progetto stesso.
Ora usare il modulo id3reader è facile.
Devi solo creare un nuovo oggetto e fornire un percorso per un file mp3 e ovviamente dobbiamo
prima importare il modulo.
Ritorniamo a Intellij
- In realtà ho intenzione di incollare quel codice. Creerò il nuovo file - Nuovo,
File Python - e
lo chiamerò, che ho citato, id3reader sottolinea p3.
Questa è la versione Python 3 del file e non ha funzionato.
Fammi copiare questo. OK, riprova. Così va meglio.
Sembra che questa volta sia effettivamente incollato correttamente e, di nuovo, puoi prenderlo
dalla sezione risorse.
Bene, questo è il file. Se torniamo al nostro esempio qui, il nostro
mp3scan, dobbiamo solo creare un nuovo oggetto e fornirgli un
percorso per un file mp3. In realtà farà il resto, ma ovviamente per cominciare,
devi prima importare il modulo.
Andiamo a farlo.
Quindi andremo a id3reader_ p3 come id3reader - questa è la
versione di Python 3. Quindi quello che facciamo, qui sotto il nostro
ciclo for, mettiamo id3r è uguale a id3reader dot
Reader con la R maiuscola, quindi f tra virgolette doppie, tra parentesi. Facciamo una stampa.
Espandiamo la stampa. Faremo una stampa tra virgolette, tra parentesi, spazio dei due punti,
parentesi graffe sinistra e destra, spazio virgola, Album con
la A maiuscola, parentesi graffe sinistra e destra, spazio dopo la virgola, traccia spazio dei due punti, ricci sinistra
e destra parentesi graffe spazio virgola, Canzone
con i due punti S maiuscoli, parentesi graffe sinistra e destra dopo lo spazio e quindi
virgolette doppio formato punto, ma nel
formato inizieremo
con id3 r punto get_value.
Il primo sarà performer tra virgolette singole,
minuscole, virgola, quindi è id3r. get_value - punto get underscore value - parentesi singolo virgoletta
album id3r punto
get_value parentesi e due virgolette singole, traccia e virgola. Quindi l'ultimo sarà id3r punto tra parentesi get_value e due
virgolette singole, titolo. OK, quindi dovrebbe
essere così. È abbastanza semplice. Il nostro generatore si occupa di ottenere i nomi dei file
per noi e il nostro ciclo principale può concentrarsi, quindi, utilizzando il modulo id3reader per leggere le informazioni sui tag. Ora avremo un errore con questo
codice quando lo
eseguo, e questo perché lo sto puntando a un file
emp3 e non a file mp3 reali. Quindi i file emp3 sono solo testo e in realtà non contengono informazioni
sui tag, che il modulo id3reader non sembra gestire troppo bene. Quindi lo eseguirò solo per confermare, ma dovremmo ricevere
un errore qui.
Non sorprende che ne otteniamo uno: un errore OS, come puoi vedere lì, argomento non valido.
E ancora, non è davvero sorprendente, e non
dovremmo provare a leggere tag id3 da piccoli file di testo. Ma dovremmo davvero gestirlo e
passare con garbo al file successivo se ne troviamo uno non valido nell'elenco.
Quindi sembra un'altra bella sfida.
Bene, quindi la sfida è quella di modificare il programma per gestire eventuali eccezioni
sollevate dal modulo id3reader.
Quindi, se viene rilevata un'eccezione, registra il nome del file in un elenco e passa al file successivo.
Quindi al termine del ciclo, stampare tutti i file che hanno causato un errore.
Quindi questa è la tua sfida.
Quindi eccoci qui.
Metti in pausa il video e torna quando sei pronto a vedere la mia versione della soluzione.
Metti in pausa il video ora.
Bene, quindi per la mia soluzione, inizierò creando un elenco vuoto.
E questo sarà per memorizzare i nomi di tutti i file problematici che tentiamo di elaborare.
Quindi vengo qui, e lo metto sulla linea 16 qui, sulla linea 15 piuttosto. Quindi vado a digitare error_list equivale a parentesi quadre sinistra e destra -
quindi aggiungendo un elenco
vuoto o creando un elenco vuoto. Quindi abbiamo ancora la riga successiva lì, che in realtà passa attraverso.
E quello che dobbiamo fare allora è, sotto il nostro
ciclo for, dobbiamo aggiungere un tentativo. Quindi prova i due
punti, quindi vogliamo mettere tutto questo codice, vogliamo rientrare al
livello successivo, in questo modo. Quindi vogliamo aggiungere un'eccezione, quindi
l'eccezione sarà lista_errore. append f.
Ora nei video sulla gestione delle eccezioni, ho suggerito che in genere non dovrebbero intercettare tutte le eccezioni.
Normalmente dovresti essere specifico e gestire eccezioni specifiche.
Ora ci sono sempre
delle eccezioni - il gioco di
parole inteso - a qualsiasi regola, e qui dobbiamo registrare
tutti i file che causano un problema, qualunque sia il problema. In casi come questo, è valido solo catturare ogni eccezione.
Se qualcosa va storto, stiamo registrando il nome del file in modo che l'utente possa indagare sul problema.
Pertanto, in questo caso è davvero accettabile catturare tutte le eccezioni.
Bene, quindi l'ultimo passaggio ora è solo quello di stampare tutti i nomi nei nostri elenchi di errori.
Quindi andiamo avanti e facciamolo.
Quindi faremo, in fondo, per spazio error_list space
in, o error
underscore file, in realtà, tra due punti error_list, quindi stampare error_file.
E se eseguiamo questo programma, dovremmo
trovare che stampiamo ogni nome di file emp3, il che non è sorprendente, dato che sono tutti file mp3
non validi Ma confermiamo solo questo - lasciamo un secondo per finire.
E tieni presente anche che puoi effettivamente eseguirlo con file mp3 reali e vedere come funziona effettivamente.
quindi se hai alcuni dei tuoi file mp3, suggerirei che è una buona idea andare avanti e testarlo con
quei veri file mp3, solo per confermare che funziona davvero.
Bene, quindi puoi vedere qui, abbiamo un elenco di tutti i file che non
erano validi, che è praticamente ogni file, sempre perché emp3 non è un file valido.
Ora l'altra cosa che potresti notare, tuttavia, è proprio in alto, in realtà abbiamo un piccolo numero di file - puoi vedere lì - che
restituisce None per i tag.
E questo perché se un file è abbastanza grande, il tentativo di leggere i tag non causa un errore, ma
non restituisce neanche il tag valido.
E ovviamente, ecco perché non stiamo arrivando a nessuno lì.
Bene, ecco come appare con i file mp3 non validi,
ma in realtà eseguiamo solo questo, solo per assicurarci che funzioni con file mp3 validi.
Quindi in realtà ne ho alcuni sul mio computer, da eseguire come test, che ho acquistato.
Quindi dovrai avere alcuni file mp3 validi, se vuoi davvero fare questo test. E solo per vederlo, in realtà
ho
una cartella qui, e ho alcuni dei
miei preferiti, ACDC e Adele - i contrasters lì. Puoi vedere, abbiamo apollo, Main, Users, timbuchalka, Desktop, TestMusic.
Quindi quello che voglio fare ora è cambiarlo per puntare a quella cartella.
Quello che farò è duplicarlo e commentare quella prima riga, e lo
cambierò per indicare alcuni file mp3 validi. Quindi è User, Users / timbuchalka / Desktop / TestMusic. È importante avere anche la
barra
finale in avanti. Quindi se eseguiamo questo ora, speriamo di ottenere dei buoni risultati.
OK.
E la ragione di ciò è che non riceviamo errori, il che è positivo, ma ovviamente non
ho cambiato il tipo di file in mp3 perché, ovviamente, ora abbiamo a che fare con file mp3 validi.
Andiamo avanti e eseguiamolo di nuovo.
E ora stiamo ricevendo alcuni dati, come puoi vedere ora, che ci aspetteremmo di ottenere.
Quindi abbiamo anche ACDC e un paio di canzoni di Adele. E puoi vedere, è chiaramente tra
il nome dell'artista, l'album, la traccia e anche il nome della canzone. Quindi, ovviamente, ciò dimostra che
sta funzionando bene.
Bene, quello che farò è, lo commenterò, per dire che puoi eseguirlo usando il formato emp3 se vuoi sul tuo
computer e lo toglierò dal commento. Ma puoi, ovviamente, cambiare quel percorso in qualunque cosa sia appropriata
per il tuo sistema operativo.
Va bene così.
Sono generatori, e
come hai visto, penso che siano un ottimo modo per gestire enormi quantità di dati, senza consumare tutta
la memoria del tuo computer.
Ora sono sicuro che puoi pensare a tutti i tipi di applicazioni in cui i generatori saranno utili; lo streaming di dati,
ad esempio, sarebbe un buon uso per un generatore.
Ora quando cerchi qualcosa usando il motore di ricerca
di Google, mostra i risultati una pagina alla volta. Quando fai clic per ottenere la pagina successiva di dati, che viene
scaricata una volta richiesta.
Quindi il motore di ricerca di Google non scarica tutte le migliaia di risultati di ricerca sul tuo computer.
Ora non ho accesso al codice sorgente di Google, quindi non posso garantire che utilizzino i generatori Python per
conservare i risultati della ricerca, ma poiché Python è stato sviluppato da Guido van
Rossum stava lavorando su Google, è una
buona ipotesi che in realtà lo stanno usando. Ed è certamente un'applicazione in cui
un generatore sarebbe molto appropriato.
Bene, finirò questo video e le nostre discussioni sui generatori qui. Nel prossimo video vedremo
le comprensioni dell'elenco.
Ora li ho citati un paio di volte nel corso e ora è il momento di scoprire cosa sono e
come usarli.
Quindi ci vediamo nel prossimo video.