#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 8 21:35:57 2018
@author: xyy
"""
import os
import sys
from collections import UserDict
def stripnulls(data):
''' strip whutespace and nulls'''
return data.replace('\00','').strip()
class FileInfo(UserDict):
'''store fle metadata'''
def __init__(self,filename = None):
UserDict.__init__(self)
self['name']=filename
class MP3Fileinfo(FileInfo):
'''stroe ID3v1.0 MP3 tage'''
tagDataMap ={'title':(3,33,stripnulls),
'artist':(33,63,stripnulls),
'album':(63,93,stripnulls),
'year':(93,126,stripnulls),
'comment':(97,126,stripnulls),
'genre':(127,128,ord)
}
def __parse(self,filename):
'''parse ID3v1.0 tags form MP3 file '''
self.clear()
try:
fsock = open(filename,'rb',0)
try:
fsock.seek(-128,2)
tagdata = fsock.read(128)
finally:
fsock.close()
if tagdata[:3]=='TAG':
for tag,(start,end,parseFunc) in self.tagDataMap.items():
self[tag] = parseFunc(tagdata[start:end])
except IOError:
pass
def __setitem__(self,key,item):
if key =='name' and item:
self.__parse(item)
FileInfo.__setitem__(self,key,item)
def listDirectory(directory,fileExtList):
'''get list of file info objects for files of particular extensions'''
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__]):
'''get file info class form filename extension'''
subclass = '%s FileInfo'%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('/home/xyy/python_learning',['.mp3']):
print('\n'.join(['%s=%s'%(k,v) for k,v in info.items()]))
print()
以上程序涉及的知识点:
- import和import from
- 类的定义
class name:
继承 class name(classname):
构造函数 init(self)
class FileInfo(UserDict):
'''store fle metadata'''
def __init__(self,filename = None):
UserDict.__init__(self)
self['name']=filename
- 类的实例化 f=FileInfo(’/xyy/xyy.mp3’) 创建类的实例只要调用一个类,仿佛 是一个函数
- 垃圾回收
python 不需要明确地释放实例,因为指派给他们的变量超出作用域时,会自动释放。内存漏泄在python很少出现 - UserDict
用户自定义字典类UserDict,它是封装了一个字典类dict。主要使用来拷贝一个字典的数据,而不是共享同一份数据。
class collections.UserDict([initialdata])
本类主要模拟一个字典。在类成员data里拷贝了一份字典数据,如果没有提供初始数据,就保存为空的方式。
UserDict类实例提供下面的属性:
data
用来保存字典的成员变量。
例子:
#python 3.4
import collections
d = {‘a’: 2, ‘b’: 3}
ud = collections.UserDict(d)
print(d, ud)
del d[‘a’]
print(d, ud)
结果输出如下:
{‘a’: 2, ‘b’: 3} {‘a’: 2, ‘b’: 3}
{‘b’: 3} {‘a’: 2, ‘b’: 3}
def __setitem__(self,key,item):
if key =='name' and item:
self.__parse(item)
FileInfo.__setitem__(self,key,item)
-
setitem_专用方法
这个是一个类方法,可以在子类中重新定义他,对父类的方法进行覆盖。 -
==和is
== 比较两个字符串的值是否相等
is 两个字符串变量是否指向同一块物理地址 -
类属性共享
-
类的私有
如果一个python函数,类方法,或属性的名字以两个下划线开始,那么他是私有的。 -
数据属性和类属性
类属性属于类本身,可以通过类名进行访问/修改
类属性也可以被类的所有实例访问/修改
在类定义之后,可以通过类名动态添加类属性,新增的类属性也被类和所有实例共有
数据属性只能通过实例访问
在实例生成后,还可以动态添加实例数据属性,但是这些实例数据属性只属于该实例