1. 程式人生 > >python 學習筆記(4)解析和字串處理

python 學習筆記(4)解析和字串處理

宣告:本文系本人學習python3總結,如有侵權等,請及時告知;

一、解析

         1、os 模組

                  Python 3 帶有一個模組叫做 os,代表“作業系統(operating system)

匯入osmodule  import os

使用os.getcwd() 函式獲得當前工作目錄。

使用os.chdir()函式改變當前工作目錄

         2、處理檔名和目錄名

                   1o.path方法

                   os.path.join() 函式從一個或多個路徑片段中構造一個路徑名。在這個例子中,它僅僅是簡單的拼接字串.  

                   os.path.expanduser() 用來將包含~符號(表示當前使用者ome目錄)的路徑擴充套件為完整的路徑。在任何有Home 目錄概念的作業系統上(包括LinuxMac OS X Windows),這個函式都能工作。返回的路徑不以斜槓結尾,但是 os.path.join()並不介意這一點。

                   os.path.split(path)split 函式分割一個完整路徑並返回目錄和檔名將split函式的返回值賦值給一個二元組。每個變數獲得了返回元組中的對應元素的值。一個元組;

                   os.path 

也包含os.path.splitext() 函式,它分割一個檔名並返回短檔名和副檔名。可以使用同樣的技術將它們的值賦值給不同的變數。

                   os.stat('filename')根據檔名獲取檔案的資訊

                            os.stat() 函式返回一個包含多種檔案元資訊的物件。

                  eg

                           os.stat('./test.c')

                           posix.stat_result(st_mode=33279,st_ino=5379962, st_dev=2050L, st_nlink=1, st_uid=1001, st_gid=1001,st_size=57894, st_atime=1367578807, st_mtime=1367579345, st_ctime=1367579345)

                   os.system('ls-al')用於執行當前系統的命令

                   os.path.realpath(filename)函式以當前目錄為絕對路徑,根據檔名構造一個絕對路徑以供其他函式使用;

更多關於os對檔案及目錄的檢視,請參考

         3、羅列目錄內容(主要是通過可以使用萬用字元)

                   glob 模組是Python標準庫中的另一個工具,它可以通過程式設計的方法獲得一個目錄的內容,並且它使用熟悉的命令列下的萬用字元。 glob 模組使用shell風格的萬用字元。

注意:如果是隱藏檔案,請在前邊加上.*

         4.列表解析

列表解析提供了一種緊湊的方式,實現了通過對列表中每一個元素應用一個函式的方法來將一個列表對映到另一個列表.  

列表解析創造一個新的列表而不改變原列表。

                    [elem * 2 for elem in a_list] 

列表解析可以使用任何表示式;

         5、字典解析

字典解析。除了兩點以外,它的語法同列表解析很類似。首先,它被花括號而不是方括號包圍第二,對於每一個元素它包含由冒號分隔的兩個表示式,而不是列表解析的一個。冒號前的表示式是字典的鍵;冒號後面的表示式是值。

         6、集合解析

集合也有自己的集合解析的語法。它和字典解析的非常相似,唯一的不同是集合只有值而沒有鍵:值對。

二、字串

         1.字串格式轉換

                  {0} {1} ..{n}代表.format(1,2);的第一個和第二個屬性...n個屬性;

                   eg:"this is a {0} {1}".format('test', 'program')

如果引數為listtuple set

•使用模組作為引數,並且通過名字來訪問其變數及函式

•使用類的例項作為引數,並且通過名字來訪問其方法和屬性

•以上方法的任意組合•使用列表作為引數,並且通過下標索引來訪問其元素(跟上一例類似)

•使用字典作為引數,並且通過鍵來訪問其值

         2、'{0.modules[test].list[1][0]'.format(sys) 

sys 模組儲存了當前正在執行的Python例項的資訊。由於已經匯入了這個模組,因此可以將其作為format()方法的引數。所以替換域{0}指代sys模組。

         3、格式說明符

                   '{0:.1f} {1}'.format(10.28, 100) 

0.1f第二部分(包括冒號及其後邊的部分)即格式說明符(format specifier),它進一步定義了被替換的變數應該如何被格式化。

.1”的意思是四捨五入到保留一們小數點。“f”的意思是定點數(與指數標記

法或者其他10 進位制數表示方法相對應)

         4、字串的分片

                   test= 'abcdefg'

字串分片跟列表的分片(slicing lists)原理是一樣的,從直觀上也說得通,因為字串本身就是一些字元序列。

                   test[0:n]

         5、字元和位元組的關係

位元組即位元組;字元是一種抽象。一個不可變(immutable)Unicode編碼的字元序列叫做string。一串由0255之間的數字組成的序列叫做bytes物件。

                   1)定義byte型別

使用“byte 字面值”語法b''來定義bytes物件。byte字面值裡的每個位元組可以是ASCII字元或者是從\x00\xff編碼了的16進位制數。

                            eg:注意.\x代表16進位制,65HEX對應的是41bytes處理的僅能支援\x

                                     >>>a_byte =b'\x41 bc'

                                     >>>a_byte

                                               b'Abc'

                   2)bytes物件的型別是bytes

                   3)  跟列表和字串一樣,我們可以通過內建函式len()來獲得bytes物件的長度。

                   4)使用+操作符可以連線bytes物件。操作的結果是一個新的bytes物件。

                   5)  連線5 個位元組的和1個位元組的bytes物件會返回一個6位元組的bytes物件。

                   6)一如列表和字串,可以使用下標記號來獲取bytes物件中的單個位元組。對字串做這種操作獲得的元素仍為字串,而對bytes物件做這種操作的返回值則為整數。確切地說,是0255之間的整數。

                   7)bytes我們不可以給單個位元組賦上新值。如果需要改變某個位元組,可以組合使用字串的切片和連線操作;或者我們也可以將bytes物件轉換為bytearray物件。

技巧:

                   1.  使用內建函式bytearray()來完成從bytes物件到可變的bytearray物件的轉換。

                  2. 所有對bytes物件的操作也可以用在bytearray物件上。

                  3. 有一點不同的就是,我們可以使用下標標記給bytearray物件的某個位元組賦值。並且,這個值必須是0255之間的一個整數。

                   4.再通過bytes()bytearray型別的資料轉換為bytes的資料型別;

注意:

                   1)不能連線bytes物件和字串。他們兩種不同的資料型別。

                   2bytes型別與 string型別的轉換

                   bytes物件有一個decode()方法,它使用某種字元編碼作為引數,然後依照這種編碼方式將bytes物件轉換為字串,對應地,字串有一個encode()方法,它也使用某種字元編碼作為引數,然後依照它將串轉換為bytes物件。

                   eg:

                   /******************************************/

                   >>>s = 'this is test'

                   >>>s

                   'thisis test'

                   >>>a_byte = bytes(s.encode('ascii'))

                   >>>a_byte

                   b'thisis test'

                   >>>s = None

                   >>>s = str(a_byte.decode('ascii'))

                   >>>s

                   'thisis test'

                   >>>a_byte

                   b'thisis test'

                   >>>

                   /**********************************************/

                   >>>s = '中國'

                   >>>s

                   '中國'

                   >>>a_byte = bytes(s.encode('utf-8'))

                   >>>a_byte

                   b'\xe4\xb8\xad\xe5\x9b\xbd'

                   >>>s = None

                   >>>s

                   >>>s = str(a_byte.decode('utf-8'))

                   >>>s

                   '中國'

                   >>>s = str(a_byte.decode('ascii'))

                   Traceback(most recent call last):

                            File "<stdin>", line 1, in<module>

                   UnicodeDecodeError:'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in                 range(128)

                   >>>s = str(a_byte.decode('utf-32'))

                   Traceback(most recent call last):

                     File "<stdin>", line 1, in<module>

                   UnicodeDecodeError:'utf32' codec can't decode bytes in position 0-3: codepoint not in              range(0x110000)

                   >>>s = str(a_byte.decode('utf-16'))

                   >>>s

                   '\ue5ad'

如上,對於不同的字元用什麼編碼,就必須用什麼解碼,每種字元都有自己的編碼規則。

                   Python 3的原始碼的預設編碼方式為UTF

修改python 3的原始碼編碼方式

                   # * coding: windows1252 *