天天看點

Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析

代碼為:

"""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。

Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
Python 中的frommodule import * 像Perl 中的usemodule ;Python 中的importmodule 像Perl 中的requiremodule
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
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'>      
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
types 子產品不包含方法,隻是表示每種 Python 對象類型的屬性。注意這個屬性必需用子產品名 types
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
FunctionType 本身沒有被定義在目前名字空間中;它隻存在于types
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
這個文法從 types 子產品中直接将 FunctionType
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
現在 FunctionType 可以直接使用,與 types

什麼時候你應該使用 from module import?

  • 如果你要經常通路子產品的屬性和方法,且不想一遍又一遍地敲入子產品名,使用 from moduleimport。
  • 如果你想要有選擇地導入某些屬性和方法,而不想要其它的,使用 from moduleimport。
  • 如果子產品包含的屬性和方法與你的某個子產品同名,你必須使用 import module
class FileInfo(UserDict):
    "store file metadata"              def __init__(self, filename=None):      
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
類也可以 (并且​​應該​​) 有doc strings ,就像方法和函數一樣。
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
__init__ 在類的執行個體建立後被立即調用。它可能會引誘你稱之為類的構造函數,但這種說法并不正确。說它引誘,是因為它看上去像 (按照習慣,__init__ 是類中第一個定義的方法),行為也像 (在一個新建立的類執行個體中,它是首先被執行的代碼),并且叫起來也像 (“init”當然意味着構造的本性)。說它不正确,是因為對象在調用__init__ 時已經被構造出來了,你已經有了一個對類的新執行個體的有效引用。但 __init__ 是在 Python
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
每個類方法的第一個參數,包括 __init__,都是指向類的目前執行個體的引用。按照習慣這個參數總是被稱為self。在__init__ 方法中,self 指向新建立的對象;在其它的類方法中,它指向方法被調用的類執行個體。盡管當定義方法時你需要明确指定self,但在調用方法時,你不 用指定它,Python
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
__init__ 方法可以接受任意數目的參數,就像函數一樣,參數可以用預設值定義,即可以設定成對于調用者可選。在本例中,filename 有一個預設值None,即Python
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
習慣上,任何 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      
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
一些僞面向對象語言,像 Powerbuilder 有一種“擴充”構造函數和其它事件的概念,即父類的方法在子類的方法執行前被自動調用。Python
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
這個類像字典一樣工作,那麼這裡就是第一個印象。我們将參數 filename 指派給對象name
Dive Into Python 學習記錄3-對擷取某檔案夾下MP3檔案資訊的代碼構成分析
注意 __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​​