代碼為:
"""Framework for getting filetype-specific metadata.
Instantiate appropriate class with filename. Returned object acts like a
dictionary, with key-value pairs for each piece of metadata.
import fileinfo
info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3")
print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()])
Or use listDirectory function to get info on all files in a directory.
for info in fileinfo.listDirectory("/music/ap/", [".mp3"]):
...
Framework can be extended by adding classes for particular file types, e.g.
HTMLFileInfo, MPGFileInfo, DOCFileInfo. Each class is completely responsible for
parsing its files appropriately; see MP3FileInfo for example.
This program is part of "Dive Into Python", a free Python book for
experienced programmers. Visit http://diveintopython.org/ for the
latest version.
"""
__author__ = "Mark Pilgrim ([email protected])"
__version__ = "$Revision: 1.3 $"
__date__ = "$Date: 2004/05/05 21:57:19 $"
__copyright__ = "Copyright (c) 2001 Mark Pilgrim"
__license__ = "Python"
import os
import sys
from UserDict import UserDict
def stripnulls(data):
"strip whitespace and nulls"
return data.replace("\00", " ").strip() # .strip()移除字元串首尾在括号内指定參數的字元,預設為空格
輸出為:
album=
comment=
name=E:\Kugou\Listen\makiyo - wake up.mp3
title=
artist=
year=
genre=12
album=needpop.com
comment=needpop.com
name=E:\Kugou\Listen\sara - 我的心好冷.mp3
title=我的心好冷(完整版)
artist=SARA needpop.com
year=2010
genre=255
album=⊙完美工作室⊙
comment=
name=E:\Kugou\Listen\三輪兄弟 鬥地主 川普.mp3
title=鬥地主(川普)
artist=三輪兄弟
year=
genre=0
album=绮樓ぁ聽風雨收藏Qq:1505388177
comment=
name=E:\Kugou\Listen\付辛博 - 我,一個人.mp3
title=
artist=
year=
genre=255
name=E:\Kugou\Listen\伍佰、china blue - 心如刀割.mp3
name=E:\Kugou\Listen\冷漠 - 醉紅顔.mp3
name=E:\Kugou\Listen\冷漠、雲菲菲 - 小三.mp3
album=
comment=
name=E:\Kugou\Listen\鳳凰傳奇 - 大聲唱.mp3
title=
artist=
year=
genre=12
解釋與拓展:
>>> num
'i like pYthon'
>>> ' spacious '.strip()
'spacious'
>>> 'www.example.com'.strip('comz.')
'www.example'
>>> 'www.example.com'.strip('comwz.')
'example'
>>> num.strip('on')
'i like pYth'
>>> num.strip('th')
'i like pYthon'
>>> 'www.example.com'.strip('comw.')
'example'
>>> 'www.example.com'.strip('comwe.')
'xampl'
>>> 'www.example.com'.strip('comwx.')
'example'
>>> 'www.example.com'.strip('lecomw.')
'xamp'
strip ()隻是去除字元串首尾的第一個開始比對的指定字元,第一次去除後若首尾還有指定字元,則繼續去除,直到首尾無指定的參數,對中間的原樣保留,
2、hasattr(os, 'system')檢視os對象是否有system屬性,有傳回True,否則False ;getattr(os, 'system') 得到os對象的system屬性
PyObject_HasAttr
(
PyObject
*o,
PyObject
*attr_name
)
Returns 1 if o has the attributeattr_name, and0 otherwise. Thisis equivalent to the Python expressionhasattr(o,attr_name). This functionalways succeeds.
PyObject_HasAttrString
(
PyObject
*o, const char
*attr_name
)
Returns 1 if o has the attributeattr_name, and0 otherwise. Thisis equivalent to the Python expressionhasattr(o,attr_name). This functionalways succeeds.
PyObject*
PyObject_GetAttr
(
PyObject
*o,
PyObject
*attr_name
)
Return value: New reference.
Retrieve an attribute named attr_name from object o. Returns the attributevalue on success, orNULL on failure. This is the equivalent of the Pythonexpressiono.attr_name.
PyObject*
PyObject_GetAttrString
(
PyObject
*o, const char
*attr_name
)
Return value: New reference.
Retrieve an attribute named attr_name from object o. Returns the attributeval(232, 232, 232); background: rgb(249, 249, 249);">
from 子產品名 import 子產品名
from UserDictimport
它與你所熟知的 import module 文法很相似,但是有一個重要的差別:UserDict 被直接導入到局部名字空間去了,是以它可以直接使用,而不需要加上子產品名的限定。你可以導入獨立的項或使用frommodule import *
比較 import 子產品名
>>> import
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> print odbchelper.buildConnectionString(params) #加上子產品名
使用在被導入子產品中定義的函數時,必須包含子產品的名字。是以不能隻使用
buildConnectionString,而應該使用
odbchelper.buildConnectionString。
Python 中的frommodule import * 像Perl 中的usemodule ;Python 中的importmodule 像Perl 中的requiremodule |
Python 中的frommodule import * 像Java 中的importmodule.* ;Python 中的importmodule 像Java 中的importmodule |
>>> import
>>> types.FunctionType <type 'function'>
>>> FunctionType Traceback (innermost last):
File "<interactive input>", line 1, in ?
NameError: There is no variable named 'FunctionType'
>>> from types import >>> FunctionType <type 'function'>
| types 子產品不包含方法,隻是表示每種 Python 對象類型的屬性。注意這個屬性必需用子產品名 types |
| FunctionType 本身沒有被定義在目前名字空間中;它隻存在于types |
| 這個文法從 types 子產品中直接将 FunctionType |
| 現在 FunctionType 可以直接使用,與 types |
什麼時候你應該使用 from module import?
- 如果你要經常通路子產品的屬性和方法,且不想一遍又一遍地敲入子產品名,使用 from moduleimport。
- 如果你想要有選擇地導入某些屬性和方法,而不想要其它的,使用 from moduleimport。
- 如果子產品包含的屬性和方法與你的某個子產品同名,你必須使用 import module
class FileInfo(UserDict):
"store file metadata" def __init__(self, filename=None):
| 類也可以 (并且應該) 有doc strings ,就像方法和函數一樣。 |
| __init__ 在類的執行個體建立後被立即調用。它可能會引誘你稱之為類的構造函數,但這種說法并不正确。說它引誘,是因為它看上去像 (按照習慣,__init__ 是類中第一個定義的方法),行為也像 (在一個新建立的類執行個體中,它是首先被執行的代碼),并且叫起來也像 (“init”當然意味着構造的本性)。說它不正确,是因為對象在調用__init__ 時已經被構造出來了,你已經有了一個對類的新執行個體的有效引用。但 __init__ 是在 Python |
| 每個類方法的第一個參數,包括 __init__,都是指向類的目前執行個體的引用。按照習慣這個參數總是被稱為self。在__init__ 方法中,self 指向新建立的對象;在其它的類方法中,它指向方法被調用的類執行個體。盡管當定義方法時你需要明确指定self,但在調用方法時,你不 用指定它,Python |
| __init__ 方法可以接受任意數目的參數,就像函數一樣,參數可以用預設值定義,即可以設定成對于調用者可選。在本例中,filename 有一個預設值None,即Python |
習慣上,任何 Python 類方法的第一個參數 (對目前執行個體的引用) 都叫做 self。這個參數扮演着 C++ 或 Java 中的保留字this 的角色,但self 在Python 中并不是一個保留字,它隻是一個命名習慣。雖然如此,也請除了self |
類名通常是第一個字母大寫;
類中的所有東西都要縮近,就像位于函數、if 語句,for
在 Python 中,類的基類隻是簡單地列在類名後面的小括号裡。是以 FileInfo 類是從 UserDict 類 (它是從 UserDict) 繼承來的。UserDict 是一個像字典一樣工作的類,它允許你完全子類化字典資料類型,同時增加你自已的行為。{也存在相似的類UserList 和UserString
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
| 一些僞面向對象語言,像 Powerbuilder 有一種“擴充”構造函數和其它事件的概念,即父類的方法在子類的方法執行前被自動調用。Python |
| 這個類像字典一樣工作,那麼這裡就是第一個印象。我們将參數 filename 指派給對象name |
| 注意 __init__ |
>>> class C:
def __init__(self,val):self.val = val
def f(self): print "hello, my value is:", self.val
>>> a = C(27)
>>> b = C(42)
>>> a.f()
hello, my value is: 27
>>> b.f()
hello, my value is: 42
>>> C.f(a)
hello, my value is: 27
>>> C.f(b)
hello, my value is: 42
從上例可以看出既可以通過python自動補充參數進行執行個體引用,也可以通過對象将值傳遞;
當定義你自已的類方法時,你必須 明确将 self 作為每個方法的第一個參數列出,包括 __init__。當從你的類中調用一個父類的一個方法時,你必須包括self 參數。但當你從類的外部調用你的類方法時,你不必對self 參數指定任何值;你完全将其忽略,而Python 會自動地替你增加執行個體的引用。
http://www.freenetpages.co.uk/hp/alan.gauld/tutclass.htm