1锁右、os 模塊
OS 模塊(operating system)讶泰,意為操作系統(tǒng)痪署,是 python 處理文件系統(tǒng)的常用模塊兄旬,因?yàn)?python 是跨平臺的领铐,所以使用 os 模塊,不用擔(dān)心操作系統(tǒng)使用什么模塊瓢姻,os 模塊會幫你選擇正確的模塊并調(diào)用莲兢。
OS 模塊中關(guān)于文件/ 目錄常用函數(shù)的使用方法:
函數(shù)名 | 使用方法 |
---|---|
getcwd() | 返回當(dāng)前工作目錄 |
chdir() | 改變工作目錄 |
listdir(path='.') | 列舉指定目錄中的文件名('.' 表示當(dāng)前目錄改艇,'..' 表示上一級目錄) |
mkdir() | 創(chuàng)建目錄(文件夾),如該目錄存在摔桦,拋出 FileExistsError 異常 |
makedirs() | 創(chuàng)建多層目錄邻耕,如果存在燕鸽,拋出異常 |
remove() | 刪除文件 |
rmdir(path) | 刪除單層目錄啊研,如果該目錄非空則拋出異常 |
removedirs(path) | 刪除多層目錄,遇到非空拋出異常 |
rename(old削解,new) | 將文件 old 重命名為 new |
system(command) | 運(yùn)行系統(tǒng)的 shell 命令 |
1.1沟娱、getcwd()
獲取當(dāng)前工作目錄:
>>> import os
>>> os.getcwd()
'C:\\Users\\hj\\AppData\\Local\\Programs\\Python\\Python36-32'
1.2济似、chdir(path)
改變當(dāng)前工作目錄盏缤,如切換到 E 盤(需要注意的是蛾找,windows 系統(tǒng)的文件路徑是雙反斜杠:\)
# 改變目錄時赵誓,可以先查看當(dāng)前工作目錄俩功,再改變,最后查看是否修改成功
>>> os.getcwd()
'C:\\Users\\hj\\AppData\\Local\\Programs\\Python\\Python36-32'
>>> os.chdir('E:\\')
>>> os.getcwd()
'E:\\'
1.3熬甫、listdir(path='.')
可以幫助知道當(dāng)前工作目錄下有哪些文件和子目錄蔓罚,它會幫你列舉出來豺谈,path 參數(shù)用于指定列舉的目錄,默認(rèn)值為 ‘.’ 厂榛,代表當(dāng)前目錄击奶,也可以使用 '..' 责掏,代表上一層目錄:
# 我的 D 盤目錄下有個 pics 的文件夾换衬,文件夾中有個 a 文件夾和 test.txt的文件,而 a 文件夾中有個 b 文件夾和test_0的文件
>>> os.chdir('D:\\pics\\a\\')
>>> os.getcwd()
'D:\\pics\\a'
>>> os.listdir() # 當(dāng)前目錄下的子目錄和文件
['b', 'test_0.txt']
>>> os.listdir(path='..') # 上一級目錄下的子目錄和文件
['a', 'test.txt']
1.4、mkdir(path)
創(chuàng)建單層目錄(即一個文件夾)术幔,如果該目錄存在湃密,則拋出 FileExistsError 的異常:
>>> os.mkdir('new_file')
>>> os.listdir()
['b', 'new_file', 'test_0.txt']
>>> os.mkdir('b')
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
os.mkdir('b')
FileExistsError: [WinError 183] 當(dāng)文件已存在時,無法創(chuàng)建該文件忿危。: 'b'
1.5没龙、makedirs(path)
創(chuàng)建多層目錄:
os.makedirs('a\\b\\c') # 表示創(chuàng)建了個 a 目錄硬纤,里面包含 b 目錄,b 目錄里包含 c 目錄
1.6洼裤、刪除目錄和文件
用于刪除指定的文件溪王,不能刪除目錄:
# 當(dāng)前工作目錄為 D:\\file莹菱,file 目錄下有 文件夾a 和 d 以及 文件 test.txt,a目錄下有b桥狡,b下有c
>>> os.getcwd()
'D:\\file'
>>> os.listdir()
['a', 'd' ,'test.txt']
>>> os.remove('test.txt') # 刪除文件 test.txt
>>> os.rmdir('d') # 刪除 文件夾 d
>>> os.removedirs('a\\b\\c') # 刪除多層目錄 a\\b\\c
>>> os.listdir() # file 文件為空
[]
1.7裹芝、rename(old娜汁,new)
重命名文件或文件夾
>>> os.listdir()
['a', 'test.txt']
>>> os.rename('a', 'b') # 重命名文件夾
>>> os.rename('test.txt', 'test_0.txt') # 重命名文件
>>> os.listdir()
['b', 'test_0.txt']
1.8掐禁、system(command)
每種系統(tǒng)都會提供一些小工具,system()函數(shù)可以使用這些工具:
# calc 是 windows 系統(tǒng)的自帶計算器
>>> os.system('calc')
1.9缕允、walk(top)
walk()函數(shù)障本,可以遍歷 top 參數(shù)指定路徑下的所有子目錄,并將結(jié)果返回一個三元組(路徑案训,[包含目錄]粪糙,[包含文件]):
# 目錄結(jié)構(gòu)為蓉冈,b 目錄下有 目錄c 和文件 test.txt洒擦,目錄c 下有 文件 test_0.txt,沒有文件夾
>>> for i in os.walk('b'):
print(i)
('b', ['c'], ['test.txt']) # b 目錄下有 目錄c 和文件 test.txt
('b\\c', [], ['test_0.txt']) # 目錄c 下有 文件 test_0.txt秦踪,沒有文件夾
2掸茅、os.path 模塊
os.path 模塊中關(guān)于路徑常用函數(shù)使用方法
函數(shù)名 | 使用方法 |
---|---|
basename(path) | 去掉目錄路徑昧狮,單獨(dú)返回文件名 |
dirname(path) | 去掉文件名逗鸣,單獨(dú)返回目錄路徑 |
join(path1[,path2[透葛,...]]) | 將 path1 和 path 2 各部分組合成一個路徑名 |
split(path) | 分割文件名和路徑僚害,返回(f_path繁调,f_name)元組 |
splitext(path) | 分離文件名與拓展名蹄胰,返回(f_path,f_name)元組 |
getsize(file) | 返回指定文件的尺寸寒随,單位是字節(jié) |
getatime(file) | 返回指定文件最近的訪問時間 |
getctime(file) | 返回指定文件的創(chuàng)建時間 |
getmtime(file) | 返回指定文件的最新修改時間 |
以下函數(shù)返回 True 或 False | |
exists(path) | 判斷指定路徑(目錄或文件)是否存在 |
isabs(path) | 判斷指定路徑是否為絕對路徑 |
isdir(path) | 判斷指定路徑是否存在且是一個目錄 |
isfile(path) | 判斷指定路徑是否存在且是一個文件 |
islink(path) | 判斷指定路徑是否存在且是一個符號鏈接 |
ismount(path) | 判斷指定路徑是否存在且是一個掛載點(diǎn) |
samefile(path1妻往,path2) | 判斷path1 和 path2 兩個路徑是否指向同一個文件 |
2.1讯泣、basename(path)和dirname(path)
分別用于獲得文件名和路徑名:
>>> os.path.dirname('file\\b\\test.txt') # 獲得路徑名
'file\\b'
>>> os.path.basename('file\\b\\test.txt') # 獲得文件名
'test.txt'
2.2阅悍、join(path1[节视,path2[,....]])
join()函數(shù)跟 BIF 的那個 join()函數(shù)不同霍掺,它是用于將路徑名和文件名組合成一個完整的路徑:
>>> os.path.join('C:\\', 'csv', 'test.csv')
'C:\\csv\\test.csv'
2.3杆烁、split(path)和splitext(path)
- split(path)函數(shù):
將 path 分隔成目錄和文件名的二元組(如果完全使用目錄简卧,那么它會將最后一個目錄作為文件名分離举娩,且不會判斷文件或者目錄存在)。
>>> path = 'C:\Python27\Lib\site-packages\myLibrary'
>>> os.path.split(path)
('C:\\Python27\\Lib\\site-packages', 'myLibrary')
>>> os.path.split('a\\b\\test.txt')
('a\\b', 'test.txt')
- splitext(path):
將 path 中的文件分割成文件名和拓展名的二元組智玻。
>>> path = 'C:\Python27\Lib\site-packages\myLibrary'
>>> os.path.splitext(path)
('C:\\Python27\\Lib\\site-packages\\myLibrary', '')
>>> os.path.splitext('a\\b\\text.txt')
('a\\b\\text', '.txt')
2.4尚困、getsize(file)
用于獲取文件的尺寸事甜,返回值以字節(jié)為單位:
# 注意滔韵,是獲取文件的尺寸陪蜻,而且文件必須存在
>>> os.getcwd()
'D:\\file'
>>> os.listdir()
['b', 'test_0.txt']
>>> os.path.getsize('test_0.txt')
4
2.5、獲取文件的最近訪問滋将、創(chuàng)建和修改時間
getatime(file)随闽、getctime(file)和 getmtime(file),分別用于獲得文件的最近訪問時間蛾扇、創(chuàng)建時間和修改時間镀首,返回值為浮點(diǎn)型的秒數(shù)鼠次,可用 time 模塊的 gmtime()或 localtime()函數(shù)換算。
- getatime(file):獲得文件的最近訪問時間竖瘾。
import time
>>> temp = time.localtime(os.path.getatime('test_0.txt'))
>>> print('test_0.txt 被訪問的時間是:', time.strftime('%d %b %Y %H: %M: %S', temp))
test_0.txt 被訪問的時間是: 18 Dec 2017 17: 05: 44
- getctime(file):獲得文件的創(chuàng)建時間捕传。
>>> temp = time.localtime(os.path.getctime('test_0.txt'))
>>> print('test_0.txt 被訪問的時間是:', time.strftime('%d %b %Y %H: %M: %S', temp))
test_0.txt 被訪問的時間是: 18 Dec 2017 17: 05: 44
- getmtime(file):獲得文件的修改時間
>>> temp = time.localtime(os.path.getmtime('test_0.txt'))
>>> print('test_0.txt 被訪問的時間是:', time.strftime('%d %b %Y %H: %M: %S', temp))
test_0.txt 被訪問的時間是: 19 Dec 2017 17: 09: 47
2.6庸论、判斷
>>> os.path.exists('test_0.txt') # 判斷目錄或文件是否存在
True
>>> os.path.isabs('D:\\file\\test_0.txt') # 判斷指定路徑是否為絕對路徑
True
>>> os.path.isdir('D:\\file\\test_0.txt') # 判斷指定路徑是否為目錄
False
>>> os.path.isdir('D:\\file\\b')
True
>>> os.path.isfile('D:\\file\\test_0.txt') # 判斷指定路徑是否為文件
True
>>> os.path.islink('D:\\file\\b') # 判斷指定路徑是否存在一個符號鏈接
False
>>> os.path.ismount('D:\\file\\b') # 判斷指定路徑是否存在一個掛載點(diǎn)
False
>>> os.path.samefile('D:\\file\\b', 'D:\\file\\') # 判斷 path1 和 path2 兩個路徑是否指向同一文件
False
3聂示、pickle 模塊
在保存文本時簇秒,都是以字符串的形式存放趋观,如果要取出數(shù)字,那么必須現(xiàn)將字符串轉(zhuǎn)換為數(shù)字编曼,然而要保存的數(shù)據(jù)像列表掐场、字典甚至是類的實(shí)例這些更復(fù)雜的數(shù)據(jù)類型時,普通的文件操作就變得不那么好用了萍膛。
pickle 模塊可以將任何 python 對象都轉(zhuǎn)換為二進(jìn)制形式存儲卦羡,這個過程稱為 pickling(泡菜)麦到;從二進(jìn)制轉(zhuǎn)換為對象的過程稱為 unpickling瓶颠。
# 將文件 my_list 存儲到 my_list_path 中刺桃,后綴名隨意瑟慈,不過最好為(.pkl 或 .pickle)
import pickle
my_list = [123, 3.14, '你好', [456,78]]
my_list_path = 'C:\\Users\\hj\\Desktop\\2\\my_list.pkl'
with open(my_list_path, 'wb') as f: # 以二進(jìn)制形式保存
pickle.dump(my_list, f) # 存放
在電腦路徑 my_list_path 中會創(chuàng)建一個 my_list.pkl 的文件葛碧,以記事本形式打開,顯示為亂碼(二進(jìn)制)蔗衡。
# 使用時绞惦,以二進(jìn)制模式把文件打開洋措,再以 load 把數(shù)據(jù)加載出來
import pickle
my_list_path = 'C:\\Users\\hj\\Desktop\\2\\my_list.pkl'
with open(my_list_path, 'rb') as f: # b 是以二進(jìn)制形式
my_list = pickle.load(f)
print(my_list)
--------------------------------
[123, 3.14, '你好', [456, 78]]
4菠发、time 模塊
4.1雷酪、python 中時間的表現(xiàn)形式
在 python 中與時間有關(guān)的模塊有:time、datetime以及 calendar蔗怠,學(xué)會計算時間寞射,對程序的調(diào)優(yōu)非常重要,可以在程序中打時間戳引矩,來具體判斷程序中哪一塊耗時最多旺韭,從而找到程序調(diào)優(yōu)的重心處掏觉。
- python 中澳腹,通常有這幾種方式表示時間:時間戳、格式化的時間字符串沥邻、元組(struct_time 共九種元素)唐全,由于 time 模塊主要是調(diào)用 C 庫實(shí)現(xiàn)的迁沫,所有在不同平臺可能會有所不同集畅。
- 時間戳(timestamp)的方式:時間戳表示是從 1970年1月1號 00:00 開始到現(xiàn)在按秒計算的偏移量,查看 type(time.time() )的返回值類型祷愉,可以看出是 float類型二鳄,返回時間戳的函數(shù)主要有 time()订讼、clock()扇苞。
- UTC(世界協(xié)調(diào)時),格林威治天文時間程拭,即世界標(biāo)準(zhǔn)時間棍潘,中國為 UTC + 8恃鞋,DST 夏令時。
- 元組方式:struct_time 元組共有 9 個元素亦歉,返回 struct_time 的函數(shù)主要有 gmtime()恤浪、localtime()、strptime()肴楷。
>>> import time
>>> ls = time.localtime()
>>> ls
time.struct_time(tm_year=2017, tm_mon=12, tm_mday=19, tm_hour=22, tm_min=17, tm_sec=50, tm_wday=1, tm_yday=353, tm_isdst=0)
- tm_year :年
- tm_mon :月(1-12)
- tm_mday :日(1-31)
- tm_hour :時(0-23)
- tm_min :分(0-59)
- tm_sec :秒(0-59)
- tm_wday :星期幾(0-6,0表示周日)
- tm_yday :一年中的第幾天(1-366)
- tm_isdst :是否是夏令時(默認(rèn)為-1)
# 因?yàn)樗窃M资锰,那么它就遵循元組的特性,索引阶祭、切片等
>>> ls[0]
2017
>>> ls.tm_year
2017
4.2直秆、time 模塊中常用函數(shù)
4.2.1濒募、time.time()
返回當(dāng)前時間的時間戳
>>> time.time()
1513865956.2554889
# 對時間戳取整
>>> int(time.time())
1513865973
4.2.2、time.localtime([secs])
將一個時間戳轉(zhuǎn)換為當(dāng)前時區(qū)的 struct_time圾结,即數(shù)據(jù)數(shù)組格式的時間
sec:轉(zhuǎn)換為 time.struct_time 類型的對象的秒數(shù)
如果 secs 為提供瑰剃,則以當(dāng)前時間為準(zhǔn)(即默認(rèn)調(diào)用 time.time())
# 為給定參數(shù)
>>> time.localtime()
time.struct_time(tm_year=2017, tm_mon=12, tm_mday=21, tm_hour=22, tm_min=25, tm_sec=18, tm_wday=3, tm_yday=355, tm_isdst=0)
# 給定參數(shù)
>>> time.localtime(1440337405.85)
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=23, tm_hour=21, tm_min=43, tm_sec=25, tm_wday=6, tm_yday=235, tm_isdst=0)
4.2.3、time.gmtime([secs])
將一個時間戳轉(zhuǎn)換為UTC時區(qū)的struct_time
time.gmtime() 函數(shù)將一個時間戳轉(zhuǎn)換為UTC時區(qū)(0時區(qū))的struct_time筝野,可選的參數(shù)sec表示從1970-1-1 00:00:00以來的秒數(shù)晌姚。其默認(rèn)值為time.time(),函數(shù)返回time.struct_time類型的對象歇竟。(struct_time是在time模塊中定義的表示時間的對象)挥唠。
如果secs參數(shù)未提供,則以當(dāng)前時間為準(zhǔn)焕议。
>>> import time
>>> time.gmtime()
time.struct_time(tm_year=2017, tm_mon=12, tm_mday=22, tm_hour=1, tm_min=48, tm_sec=3, tm_wday=4, tm_yday=356, tm_isdst=0)
>>> time.gmtime(1440337405.85)
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=23, tm_hour=13, tm_min=43, tm_sec=25, tm_wday=6, tm_yday=235, tm_isdst=0)
4.2.4宝磨、time.mktime(t)
將一個 struct_time 轉(zhuǎn)換為時間戳
time.mktime() 函數(shù)執(zhí)行與gmtime(), localtime()相反的操作,它接收struct_time對象作為參數(shù),返回用秒數(shù)表示時間的浮點(diǎn)數(shù)盅安。
如果輸入的值不是一個合法的時間唤锉,將觸發(fā) OverflowError 或 ValueError
# t 結(jié)構(gòu)化的時間或完整的 9位元組元素
>>> time.mktime(time.localtime())
1513907454.0
4.2.5、time.sleep(secs)
線程推遲指定的時間運(yùn)行别瞭,線程睡眠指定時間窿祥,單位為秒
# 睡眠 10 秒
time.sleep(10)
4.2.6、time.clock()
這個函數(shù)蝙寨, 函數(shù)以浮點(diǎn)數(shù)計算的秒數(shù)返回當(dāng)前的CPU時間晒衩。用來衡量不同程序的耗時嗤瞎,比time.time()更有用。在不同的系統(tǒng)上含義不同浸遗。在 UNIX 系統(tǒng)上猫胁,它返回的是“進(jìn)程時間”,它是用秒表示的浮點(diǎn)數(shù)(時間戳)跛锌。而在Windows中弃秆,第一次調(diào)用,返回的是進(jìn)程運(yùn)行時實(shí)際時間髓帽。而第二次之后的調(diào)用是自第一次調(diào)用以后到現(xiàn)在的運(yùn)行時間菠赚。
- (1)在第一次調(diào)用的時候,返回的是程序運(yùn)行的實(shí)際時間郑藏;
- (2)第二次之后的調(diào)用衡查,返回的是自第一次調(diào)用后,到這次調(diào)用的時間間隔在win32系統(tǒng)下,這個函數(shù)返回的是真實(shí)時間(wall time)必盖,而在Unix/Linux下返回的是CPU時間
import time
def procedure():
time.sleep(3)
time1 = time.clock()
procedure()
print(time.clock() - time1, 'seconds process time!')
time2 = time.time()
procedure()
print(time.time() - time2, 'seconds wall time!')
------------------------------------------------------------------
3.0008666269000823 seconds process time!
3.0008370876312256 seconds wall time!
4.2.7拌牲、time.asctime([t])
把一個表示時間的元組或者 struct_time 表示為 ‘Sun Aug 23 14:31:59 2015’ 這種形式,如果沒有參數(shù)給定歌粥,那么將會使用 time.local() 作為參數(shù)傳入塌忽。
>>> time.asctime(time.gmtime())
'Fri Dec 22 02:20:36 2017'
4.2.8、time.ctime([secs])
將一個時間戳(按秒計算的浮點(diǎn)數(shù))轉(zhuǎn)換為 time.asctime()的形式失驶,如果未指定參數(shù)土居,將會默認(rèn)使用 time.time(),作用相當(dāng)于 time.asctime(time.localtime(secs)嬉探。
# sec 要轉(zhuǎn)換為字符串時間的秒數(shù)
>>> time.ctime(1440338541.0)
'Sun Aug 23 22:02:21 2015'
>>> time.ctime()
'Fri Dec 22 10:23:32 2017'
4.2.9擦耀、time.strftime(format [, t])
返回字符串表示的當(dāng)?shù)貢r間。
把一個代表時間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉(zhuǎn)化為格式化的時間字符串涩堤,格式由參數(shù)format決定眷蜓。如果未指定,將傳入time.localtime()胎围。如果元組中任何一個元素越界账磺,就會拋出ValueError的異常。函數(shù)返回的是一個可讀表示的本地時間的字符串痊远。
- format :格式化字符串
- t:可選參數(shù)是一個 struct_time 對象
時間字符串支持的格式符號:(區(qū)分大小寫)
%a 本地星期名稱的簡寫(如星期四為Thu)
%A 本地星期名稱的全稱(如星期四為Thursday)
%b 本地月份名稱的簡寫(如八月份為agu)
%B 本地月份名稱的全稱(如八月份為august)
%c 本地相應(yīng)的日期和時間的字符串表示(如:15/08/27 10:20:06)
%d 一個月中的第幾天(01 - 31)
%f 微妙(范圍0.999999)
%H 一天中的第幾個小時(24小時制垮抗,00 - 23)
%I 第幾個小時(12小時制,0 - 11)
%j 一年中的第幾天(001 - 366)
%m 月份(01 - 12)
%M 分鐘數(shù)(00 - 59)
%p 本地am或者pm的相應(yīng)符
%S 秒(00 - 61)
%U 一年中的星期數(shù)碧聪。(00 - 53星期天是一個星期的開始冒版。)第一個星期天之 前的所有天數(shù)都放在第0周。
%w 一個星期中的第幾天(0 - 6逞姿,0是星期天)
%W 和%U基本相同辞嗡,不同的是%W以星期一為一個星期的開始捆等。
%x 本地相應(yīng)日期字符串(如15/08/01)
%X 本地相應(yīng)時間字符串(如08:08:10)
%y 去掉世紀(jì)的年份(00 - 99)兩個數(shù)字表示的年份
%Y 完整的年份(4個數(shù)字表示年份)
%z 與UTC時間的間隔(如果是本地時間,返回空字符串)
%Z 時區(qū)的名字(如果是本地時間续室,返回空字符串)
%% ‘%’字符
>>> import time
>>> ls = time.localtime()
>>> ls
time.struct_time(tm_year=2017, tm_mon=12, tm_mday=22, tm_hour=10, tm_min=29, tm_sec=24, tm_wday=4, tm_yday=356, tm_isdst=0)
>>> time.strftime('%Y-%m-%d %H:%M:%S', ls)
'2017-12-22 10:29:24'
import time
from datetime import datetime
# 獲取當(dāng)前時間的時分秒
print(time.strftime('%H:%M:%S'))
10:33:36
print(time.strftime('%y-%m-%d')) # 獲取當(dāng)前時間的年月日
t = datetime.now() # 格式符實(shí)例
print(t)
print(t.strftime('%a')) # 當(dāng)前時間的星期簡寫
print(t.strftime('%A')) # 當(dāng)前時間的星期全寫
print(t.strftime('%B')) # 當(dāng)前時間的月份全寫
----------------------
17-12-22
2017-12-22 10:42:49.912259
Fri
Friday
December
4.2.10栋烤、time.striptime(string [,format])
將格式字符串轉(zhuǎn)換成 struct_time
該函數(shù)是time.strftime()函數(shù)的逆操作。time strptime() 函數(shù)根據(jù)指定的格式把一個時間字符串解析為時間元組挺狰。所以函數(shù)返回的是struct_time對象明郭。
>>> stime = "2015-08-24 13:01:30" # 創(chuàng)建一個時間字符串變量 stime
# 通過strptime()函數(shù)將 stime轉(zhuǎn)換為 struct_time形式
>>> formattime = time.strptime(stime,"%Y-%m-%d %H:%M:%S")
>>> formattime
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=24, tm_hour=13, tm_min=1, tm_sec=30, tm_wday=0, tm_yday=236, tm_isdst=-1)
# 遍歷返回的時間元組序列
>>> for i in formattime:
print(i, end=' ')
2015 8 24 13 1 30 0 236 -1
注意在使用strptime()函數(shù)將一個指定格式的時間字符串轉(zhuǎn)化成元組時,參數(shù)format的格式必須和string的格式保持一致丰泊,如果string中日期間使用“-”分隔薯定,format中也必須使用“-”分隔,時間中使用冒號“:”分隔瞳购,后面也必須使用冒號分隔话侄,否則會報格式不匹配的錯誤。
http://blog.csdn.net/SeeTheWorld518/article/details/48314501