1、os 模塊
OS 模塊(operating system),意為操作系統,是 python 處理文件系統的常用模塊,因為 python 是跨平臺的,所以使用 os 模塊,不用擔心操作系統使用什么模塊,os 模塊會幫你選擇正確的模塊并調用。
OS 模塊中關于文件/ 目錄常用函數的使用方法:
函數名 | 使用方法 |
---|---|
getcwd() | 返回當前工作目錄 |
chdir() | 改變工作目錄 |
listdir(path='.') | 列舉指定目錄中的文件名('.' 表示當前目錄,'..' 表示上一級目錄) |
mkdir() | 創建目錄(文件夾),如該目錄存在,拋出 FileExistsError 異常 |
makedirs() | 創建多層目錄,如果存在,拋出異常 |
remove() | 刪除文件 |
rmdir(path) | 刪除單層目錄,如果該目錄非空則拋出異常 |
removedirs(path) | 刪除多層目錄,遇到非空拋出異常 |
rename(old,new) | 將文件 old 重命名為 new |
system(command) | 運行系統的 shell 命令 |
1.1、getcwd()
獲取當前工作目錄:
>>> import os
>>> os.getcwd()
'C:\\Users\\hj\\AppData\\Local\\Programs\\Python\\Python36-32'
1.2、chdir(path)
改變當前工作目錄,如切換到 E 盤(需要注意的是,windows 系統的文件路徑是雙反斜杠:\)
# 改變目錄時,可以先查看當前工作目錄,再改變,最后查看是否修改成功
>>> os.getcwd()
'C:\\Users\\hj\\AppData\\Local\\Programs\\Python\\Python36-32'
>>> os.chdir('E:\\')
>>> os.getcwd()
'E:\\'
1.3、listdir(path='.')
可以幫助知道當前工作目錄下有哪些文件和子目錄,它會幫你列舉出來,path 參數用于指定列舉的目錄,默認值為 ‘.’ ,代表當前目錄,也可以使用 '..' ,代表上一層目錄:
# 我的 D 盤目錄下有個 pics 的文件夾,文件夾中有個 a 文件夾和 test.txt的文件,而 a 文件夾中有個 b 文件夾和test_0的文件
>>> os.chdir('D:\\pics\\a\\')
>>> os.getcwd()
'D:\\pics\\a'
>>> os.listdir() # 當前目錄下的子目錄和文件
['b', 'test_0.txt']
>>> os.listdir(path='..') # 上一級目錄下的子目錄和文件
['a', 'test.txt']
1.4、mkdir(path)
創建單層目錄(即一個文件夾),如果該目錄存在,則拋出 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] 當文件已存在時,無法創建該文件。: 'b'
1.5、makedirs(path)
創建多層目錄:
os.makedirs('a\\b\\c') # 表示創建了個 a 目錄,里面包含 b 目錄,b 目錄里包含 c 目錄
1.6、刪除目錄和文件
用于刪除指定的文件,不能刪除目錄:
# 當前工作目錄為 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)
每種系統都會提供一些小工具,system()函數可以使用這些工具:
# calc 是 windows 系統的自帶計算器
>>> os.system('calc')
1.9、walk(top)
walk()函數,可以遍歷 top 參數指定路徑下的所有子目錄,并將結果返回一個三元組(路徑,[包含目錄],[包含文件]):
# 目錄結構為,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 模塊中關于路徑常用函數使用方法
函數名 | 使用方法 |
---|---|
basename(path) | 去掉目錄路徑,單獨返回文件名 |
dirname(path) | 去掉文件名,單獨返回目錄路徑 |
join(path1[,path2[,...]]) | 將 path1 和 path 2 各部分組合成一個路徑名 |
split(path) | 分割文件名和路徑,返回(f_path,f_name)元組 |
splitext(path) | 分離文件名與拓展名,返回(f_path,f_name)元組 |
getsize(file) | 返回指定文件的尺寸,單位是字節 |
getatime(file) | 返回指定文件最近的訪問時間 |
getctime(file) | 返回指定文件的創建時間 |
getmtime(file) | 返回指定文件的最新修改時間 |
以下函數返回 True 或 False | |
exists(path) | 判斷指定路徑(目錄或文件)是否存在 |
isabs(path) | 判斷指定路徑是否為絕對路徑 |
isdir(path) | 判斷指定路徑是否存在且是一個目錄 |
isfile(path) | 判斷指定路徑是否存在且是一個文件 |
islink(path) | 判斷指定路徑是否存在且是一個符號鏈接 |
ismount(path) | 判斷指定路徑是否存在且是一個掛載點 |
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()函數跟 BIF 的那個 join()函數不同,它是用于將路徑名和文件名組合成一個完整的路徑:
>>> os.path.join('C:\\', 'csv', 'test.csv')
'C:\\csv\\test.csv'
2.3、split(path)和splitext(path)
- split(path)函數:
將 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)
用于獲取文件的尺寸,返回值以字節為單位:
# 注意,是獲取文件的尺寸,而且文件必須存在
>>> os.getcwd()
'D:\\file'
>>> os.listdir()
['b', 'test_0.txt']
>>> os.path.getsize('test_0.txt')
4
2.5、獲取文件的最近訪問、創建和修改時間
getatime(file)、getctime(file)和 getmtime(file),分別用于獲得文件的最近訪問時間、創建時間和修改時間,返回值為浮點型的秒數,可用 time 模塊的 gmtime()或 localtime()函數換算。
- 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):獲得文件的創建時間。
>>> 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') # 判斷指定路徑是否存在一個掛載點
False
>>> os.path.samefile('D:\\file\\b', 'D:\\file\\') # 判斷 path1 和 path2 兩個路徑是否指向同一文件
False
3、pickle 模塊
在保存文本時,都是以字符串的形式存放,如果要取出數字,那么必須現將字符串轉換為數字,然而要保存的數據像列表、字典甚至是類的實例這些更復雜的數據類型時,普通的文件操作就變得不那么好用了。
pickle 模塊可以將任何 python 對象都轉換為二進制形式存儲,這個過程稱為 pickling(泡菜);從二進制轉換為對象的過程稱為 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: # 以二進制形式保存
pickle.dump(my_list, f) # 存放
在電腦路徑 my_list_path 中會創建一個 my_list.pkl 的文件,以記事本形式打開,顯示為亂碼(二進制)。
# 使用時,以二進制模式把文件打開,再以 load 把數據加載出來
import pickle
my_list_path = 'C:\\Users\\hj\\Desktop\\2\\my_list.pkl'
with open(my_list_path, 'rb') as f: # b 是以二進制形式
my_list = pickle.load(f)
print(my_list)
--------------------------------
[123, 3.14, '你好', [456, 78]]
4、time 模塊
4.1、python 中時間的表現形式
在 python 中與時間有關的模塊有:time、datetime以及 calendar,學會計算時間,對程序的調優非常重要,可以在程序中打時間戳,來具體判斷程序中哪一塊耗時最多,從而找到程序調優的重心處。
- python 中,通常有這幾種方式表示時間:時間戳、格式化的時間字符串、元組(struct_time 共九種元素),由于 time 模塊主要是調用 C 庫實現的,所有在不同平臺可能會有所不同。
- 時間戳(timestamp)的方式:時間戳表示是從 1970年1月1號 00:00 開始到現在按秒計算的偏移量,查看 type(time.time() )的返回值類型,可以看出是 float類型,返回時間戳的函數主要有 time()、clock()。
- UTC(世界協調時),格林威治天文時間,即世界標準時間,中國為 UTC + 8,DST 夏令時。
- 元組方式:struct_time 元組共有 9 個元素,返回 struct_time 的函數主要有 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 :是否是夏令時(默認為-1)
# 因為它是元組,那么它就遵循元組的特性,索引、切片等
>>> ls[0]
2017
>>> ls.tm_year
2017
4.2、time 模塊中常用函數
4.2.1、time.time()
返回當前時間的時間戳
>>> time.time()
1513865956.2554889
# 對時間戳取整
>>> int(time.time())
1513865973
4.2.2、time.localtime([secs])
將一個時間戳轉換為當前時區的 struct_time,即數據數組格式的時間
sec:轉換為 time.struct_time 類型的對象的秒數
如果 secs 為提供,則以當前時間為準(即默認調用 time.time())
# 為給定參數
>>> 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)
# 給定參數
>>> 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])
將一個時間戳轉換為UTC時區的struct_time
time.gmtime() 函數將一個時間戳轉換為UTC時區(0時區)的struct_time,可選的參數sec表示從1970-1-1 00:00:00以來的秒數。其默認值為time.time(),函數返回time.struct_time類型的對象。(struct_time是在time模塊中定義的表示時間的對象)。
如果secs參數未提供,則以當前時間為準。
>>> 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 轉換為時間戳
time.mktime() 函數執行與gmtime(), localtime()相反的操作,它接收struct_time對象作為參數,返回用秒數表示時間的浮點數。
如果輸入的值不是一個合法的時間,將觸發 OverflowError 或 ValueError
# t 結構化的時間或完整的 9位元組元素
>>> time.mktime(time.localtime())
1513907454.0
4.2.5、time.sleep(secs)
線程推遲指定的時間運行,線程睡眠指定時間,單位為秒
# 睡眠 10 秒
time.sleep(10)
4.2.6、time.clock()
這個函數, 函數以浮點數計算的秒數返回當前的CPU時間。用來衡量不同程序的耗時,比time.time()更有用。在不同的系統上含義不同。在 UNIX 系統上,它返回的是“進程時間”,它是用秒表示的浮點數(時間戳)。而在Windows中,第一次調用,返回的是進程運行時實際時間。而第二次之后的調用是自第一次調用以后到現在的運行時間。
- (1)在第一次調用的時候,返回的是程序運行的實際時間;
- (2)第二次之后的調用,返回的是自第一次調用后,到這次調用的時間間隔在win32系統下,這個函數返回的是真實時間(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’ 這種形式,如果沒有參數給定,那么將會使用 time.local() 作為參數傳入。
>>> time.asctime(time.gmtime())
'Fri Dec 22 02:20:36 2017'
4.2.8、time.ctime([secs])
將一個時間戳(按秒計算的浮點數)轉換為 time.asctime()的形式,如果未指定參數,將會默認使用 time.time(),作用相當于 time.asctime(time.localtime(secs)。
# sec 要轉換為字符串時間的秒數
>>> 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])
返回字符串表示的當地時間。
把一個代表時間的元組或者struct_time(如由time.localtime()和time.gmtime()返回)轉化為格式化的時間字符串,格式由參數format決定。如果未指定,將傳入time.localtime()。如果元組中任何一個元素越界,就會拋出ValueError的異常。函數返回的是一個可讀表示的本地時間的字符串。
- format :格式化字符串
- t:可選參數是一個 struct_time 對象
時間字符串支持的格式符號:(區分大小寫)
%a 本地星期名稱的簡寫(如星期四為Thu)
%A 本地星期名稱的全稱(如星期四為Thursday)
%b 本地月份名稱的簡寫(如八月份為agu)
%B 本地月份名稱的全稱(如八月份為august)
%c 本地相應的日期和時間的字符串表示(如: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 分鐘數(00 - 59)
%p 本地am或者pm的相應符
%S 秒(00 - 61)
%U 一年中的星期數。(00 - 53星期天是一個星期的開始。)第一個星期天之 前的所有天數都放在第0周。
%w 一個星期中的第幾天(0 - 6,0是星期天)
%W 和%U基本相同,不同的是%W以星期一為一個星期的開始。
%x 本地相應日期字符串(如15/08/01)
%X 本地相應時間字符串(如08:08:10)
%y 去掉世紀的年份(00 - 99)兩個數字表示的年份
%Y 完整的年份(4個數字表示年份)
%z 與UTC時間的間隔(如果是本地時間,返回空字符串)
%Z 時區的名字(如果是本地時間,返回空字符串)
%% ‘%’字符
>>> 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
# 獲取當前時間的時分秒
print(time.strftime('%H:%M:%S'))
10:33:36
print(time.strftime('%y-%m-%d')) # 獲取當前時間的年月日
t = datetime.now() # 格式符實例
print(t)
print(t.strftime('%a')) # 當前時間的星期簡寫
print(t.strftime('%A')) # 當前時間的星期全寫
print(t.strftime('%B')) # 當前時間的月份全寫
----------------------
17-12-22
2017-12-22 10:42:49.912259
Fri
Friday
December
4.2.10、time.striptime(string [,format])
將格式字符串轉換成 struct_time
該函數是time.strftime()函數的逆操作。time strptime() 函數根據指定的格式把一個時間字符串解析為時間元組。所以函數返回的是struct_time對象。
>>> stime = "2015-08-24 13:01:30" # 創建一個時間字符串變量 stime
# 通過strptime()函數將 stime轉換為 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()函數將一個指定格式的時間字符串轉化成元組時,參數format的格式必須和string的格式保持一致,如果string中日期間使用“-”分隔,format中也必須使用“-”分隔,時間中使用冒號“:”分隔,后面也必須使用冒號分隔,否則會報格式不匹配的錯誤。
http://blog.csdn.net/SeeTheWorld518/article/details/48314501