Zanurkuj w Pythonie/Obiekty i klasy: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Piotr (dyskusja | edycje)
mNie podano opisu zmian
Linia 7:
|5.1|{{Python/Src|fileinfo.py}}
|tekst=<nowiki>
#-*- coding: utf-8 -*-
"""Framework do pobierania matedanych specyficznych dla danego typu pliku.
 
u"""Framework do pobierania matedanych specyficznych dla danego typu pliku.
Można utworzyć instancję odpowiedniej klasy podając jej nazwę pliku w konstruktorze.
 
Zwrócony obiekt zachowuje się jak słownik posiadający parę klucz-wartość
Można utworzyć instancję odpowiedniej klasy podając jej nazwę pliku w konstruktorze.
dla każdego fragmentu metadanych.
Zwrócony obiekt zachowuje się jak słownik posiadający parę klucz-wartość
dla każdego fragmentu metadanych.
import fileinfo
 
info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")
import fileinfo
print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()])
info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")
print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()])
Lub użyć funkcji listDirectory, aby pobrać informacje o wszystkich plikach w katalogu.
 
for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
Lub użyć funkcji listDirectory, aby pobrać informacje o wszystkich plikach w katalogu.
...
for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
...
Framework może być roszerzony poprzez dodanie klas dla poszczególnych typów plików, np.:
 
HTMLFileInfo, MPGFileInfo, DOCFileInfo. Każda klasa jest całkowicie odpowiedzialna
Framework może być roszerzony poprzez dodanie klas dla poszczególnych typów plików, np.:
za właściwe sparsowanie swojego pliku; zobacz przykład MP3FileInfo.
HTMLFileInfo, MPGFileInfo, DOCFileInfo. Każda klasa jest całkowicie odpowiedzialna
za właściwe sparsowanie swojego pliku; zobacz przykład MP3FileInfo.
Ten program jest częścią książki "Zanurkuj w Pythonie", podręcznika
"""
o Pythonie dla doświadczonych programistów. Najnowszą wersję można
 
znaleźć tu: http://pl.wikibooks.org/wiki/Python.
import os
import sys
Program ten został oparty na przykładach zawartych w książce
 
"Dive Into Python", a dostępnej stąd: http://www.diveintopython.org.
def stripnulls(data):
"""
u"usuwa białe znaki i nulle"
return data.replace("\00", " ").strip()
__author__ = "Mark Pilgrim (mark@diveintopython.org)"
 
__version__ = "$Revision: 1.3 $"
class FileInfo(dict):
__date__ = "$Date: 2004/05/05 21:57:19 $"
u"przechowuje metadane pliku"
__copyright__ = "Copyright (c) 2001 Mark Pilgrim"
def __init__(self, filename=None):
__license__ = "Python"
dict.__init__(self)
self["plik"] = filename
import os
import sys
class MP3FileInfo(FileInfo):
from UserDict import UserDict
u"przechowuje znaczniki ID3v1.0 MP3"
tagDataMap = {u"tytuł" : ( 3, 33, stripnulls),
def stripnulls(data):
"artysta" : ( 33, 63, stripnulls),
"usuwa białe znaki i nulle"
"album" : ( 63, 93, stripnulls),
return data.replace("\00", " ").strip()
"rok" : ( 93, 97, stripnulls),
"komentarz" : ( 97, 126, stripnulls),
class FileInfo(UserDict):
"gatunek" : (127, 128, ord)}
"przechowuje metadane pliku"

def __init____parse(self, filename=None):
u"parsuje UserDictznaczniki ID3v1.__init__(self)0 z pliku MP3"
self["name"] = filename.clear()
try:
fsock = open(filename, "rb", 0)
class MP3FileInfo(FileInfo):
try:
"przechowuje znaczniki ID3v1.0 MP3"
tagDataMap = {"title" : ( 3, 33 fsock.seek(-128, stripnulls2),
tagdata = "artist" : fsock.read( 33, 63, stripnulls128),
"album" finally: ( 63, 93, stripnulls),
"year" : fsock.close( 93, 97, stripnulls),
if tagdata[:3] == "comment" 'TAG': ( 97, 126, stripnulls),
for "genre" :tag, (127start, 128end, ordparseFunc)} in self.tagDataMap.items():
self[tag] = parseFunc(tagdata[start:end])
def __parse(self, filename) except IOError:
"parsuje znaczniki ID3v1.0 z pliku MP3"pass
 
self.clear()
def __setitem__(self, key, tryitem):
if fsockkey = open(filename,= "rbplik", 0)and item:
try:self.__parse(item)
fsockFileInfo.seek__setitem__(-128self, key, 2item)
 
tagdata = fsock.read(128)
def listDirectory(directory, fileExtList):
finally:
u"zwraca listę obiektów zawierających metadane dla plików o podanych rozszerzeniach"
fsock.close()
fileList = [os.path.normcase(f) for f in os.listdir(directory)]
if tagdata[:3] == 'TAG':
fileList = [os.path.join(directory, f) for f in fileList \
for tag, (start, end, parseFunc) in self.tagDataMap.items():
if selfos.path.splitext(f)[tag1] =in parseFunc(tagdata[start:endfileExtList])
def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):
except IOError:
u"zwraca klasę metadanych pliku na podstawie podanego rozszerzenia"
pass
subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
def __setitem__(self, key, item):
return [getFileInfoClass(f)(f) for f in fileList]
if key == "name" and item:
 
self.__parse(item)
if __name__ == "__main__":
FileInfo.__setitem__(self, key, item)
for info in listDirectory("/music/_singles/", [".mp3"]): #(1)
print "\n".join("%s=%s" % (k, v) for k, v in info.items())
def listDirectory(directory, fileExtList):
print
"zwraca listę obiektów zawierających metadane dla plików o podanych rozszerzeniach"
fileList = [os.path.normcase(f) for f in os.listdir(directory)]
fileList = [os.path.join(directory, f) for f in fileList \
if os.path.splitext(f)[1] in fileExtList]
def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):
"zwraca klasę metadanych pliku na podstawie podanego rozszerzenia"
subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:]
return hasattr(module, subclass) and getattr(module, subclass) or FileInfo
return [getFileInfoClass(f)(f) for f in fileList]
if __name__ == "__main__":
for info in listDirectory("/music/_singles/", [".mp3"]): #(1)
print "\n".join(["%s=%s" % (k, v) for k, v in info.items()])
print
</nowiki>
 
Linia 103 ⟶ 91:
}}
 
W wyniku wykonania tego programu możemy otrzymać podobne wyjście do poniższego. JeśliJest otrzymaszniemal takie same wyjścieniemożliwe, będzieabyś tootrzymał wynikało z bardzo dużego zbiegu okoliczności, ponieważidentyczne wyjście zależy od tego, jakiej muzyki słuchasz.
 
{{samp|<nowiki>album=
rok=1999
komentarz=http://mp3.com/ghostmachine
tytuł=A Time Long Forgotten (Concept
artysta=Ghost in the Machine
gatunek=31
plik=/music/_singles/a_time_long_forgotten_con.mp3
 
album=Rave Mix
rok=2000
komentarz=http://mp3.com/DJMARYJANE
tytuł=HELLRAISER****Trance from Hell
artysta=***DJ MARY-JANE***
gatunek=31
plik=/music/_singles/hellraiser.mp3
 
album=Rave Mix
rok=2000
komentarz=http://mp3.com/DJMARYJANE
tytuł=KAIRO****THE BEST GOA
artysta=***DJ MARY-JANE***
gatunek=31
plik=/music/_singles/kairo.mp3
 
album=Journeys
rok=2000
komentarz=http://mp3.com/MastersofBalan
tytuł=Long Way Home
artysta=Masters of Balance
gatunek=31
plik=/music/_singles/long_way_home1.mp3
 
album=
rok=2000
komentarz=http://mp3.com/cynicproject
tytuł=Sidewinder
artysta=The Cynic Project
gatunek=18
plik=/music/_singles/sidewinder.mp3
 
album=Digitosis@128k
{{samp|1=
rok=2000
<nowiki>album=
komentarz=http://mp3.com/artists/95/vxp
artist=Ghost in the Machine
tytuł=Spinning
title=A Time Long Forgotten (Concept
artysta=VXpanded
genre=31
gatunek=255
name=/music/_singles/a_time_long_forgotten_con.mp3
plik=/music/_singles/spinning.mp3
year=1999
comment=http://mp3.com/ghostmachine
album=Rave Mix
artist=***DJ MARY-JANE***
title=HELLRAISER****Trance from Hell
genre=31
name=/music/_singles/hellraiser.mp3
year=2000
comment=http://mp3.com/DJMARYJANE
album=Rave Mix
artist=***DJ MARY-JANE***
title=KAIRO****THE BEST GOA
genre=31
name=/music/_singles/kairo.mp3
year=2000
comment=http://mp3.com/DJMARYJANE
album=Journeys
artist=Masters of Balance
title=Long Way Home
genre=31
name=/music/_singles/long_way_home1.mp3
year=2000
comment=http://mp3.com/MastersofBalan
album=
artist=The Cynic Project
title=Sidewinder
genre=18
name=/music/_singles/sidewinder.mp3
year=2000
comment=http://mp3.com/cynicproject
album=Digitosis@128k
artist=VXpanded
title=Spinning
genre=255
name=/music/_singles/spinning.mp3
year=2000
comment=http://mp3.com/artists/95/vxp
</nowiki>}}