python筆記-6(import導入、time/datetime/random/os/sys模塊)
一、了解模塊導入的基本知識
此部分此處不展開細說import導入,僅寫幾個點目前的認知即可。其它內容待日后有深入理解了再來細說
1、import可以導入的兩種不同的內容
1.1 *.py文件結尾的文件
1.2 package文件
package和文件夾圖標類似,package中又__init__.py的文件
2、模塊導入的幾種導入方式
2.1 from xxx import xxx as xxx
2.2 from xxx import xxx as xxx as xxx 別名
2.3 import xxx
3、import 和 from xxx import 的區別
import xxx的本質是執行py文件,import package是執行__init__.py
from xxx import xxx 的本質是將xxx部分的內容復制到本地,進行調用。
4、需要重點掌握給sys(python解釋器)添加環境變量的方法
4.1 os.path.abs(文件)
4.2 os.path.dirname(絕對路徑)
4.3 sys.path.append()/sys.path.insert()
二、time模塊-->時間模塊
1、要熟悉時間的三種表示方式
1.1、格式化字符串 ‘2018-2-1 11:11:12’
此處的格式我們可以隨意去自定義,其實質是按照固定的格式,從時間的9元組中獲取需要的變量,根據定義的格式輸出字符串
1.2、時間戳
一串數字,用來表示和1970年的時間間隔,單位為s。
注意點:一個時間戳所換算成的時間九元組是固定的。但是,根據時區的不同,python會進行相應的轉換,轉換成當地的時間。在熟悉了這個情況后,在后面的時間表示方式的轉換中,要明確我要轉換成的是標准時間還是當地時間。
1.3、元組 struct_time 9個元素
year (including century, e.g. 1998) 年
month (1-12)月
day (1-31)日
hours (0-23)時
minutes (0-59)分
seconds (0-59)秒
weekday (0-6, Monday is 0)一周第幾天,注意星期一是第0天
Julian day (day in the year, 1-366)一年第幾天,從1開始計
DST (Daylight Savings Time) flag (-1, 0 or 1)是否是夏令時,0代表不是,1代表是
例子
|
1
|
time.struct_time(tm_year
=
2017
, tm_mon
=
12
, tm_mday
=
31
, tm_hour
=
23
, tm_min
=
27
, tm_sec
=
2
, tm_wday
=
6
, tm_yday
=
365
, tm_isdst
=
0
)
|
4、time模塊的幾個變量
4.1 timezone
表示世界標准時間utc和本地時間的差值,單位為秒。中國的時區比時間標准時間快8小時。
utc - (utc+8)
|
1
2
3
4
5
6
7
|
>>> time.timezone
-
28800
>>>
28800
/
3600
8.0
|
4.2 altzone
UTC和本地夏令時直接的差值,單位為s 我們不使用夏令時,所以此處不做深究,了解即可
|
1
2
3
|
>>> time.altzone
#夏令時和utc的時間差值
-
32400
|
4.3 time.daylight
是否使用了夏令時,0為不使用
|
1
2
3
|
>>> time.daylight 是否使用了夏令時
0
|
5、time的函數
5.1 time.time() 獲取時間戳
此處獲取的時間戳為utc標准時間與1970的時間間隔。
5.2 time.sleep()
延時多少秒,單位為秒
5.3 time.gmtime()
gmtime() -- convert seconds since Epoch to UTC tuple
將時間戳轉換為utc時間
5.4 time.localtime()
localtime() -- convert seconds since Epoch to local time tuple
將時間戳轉換成本地時間
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> time.time()
1520614121.487381
>>> time.gmtime(time.time())
time.struct_time(tm_year
=
2018
, tm_mon
=
3
, tm_mday
=
9
, tm_hour
=
16
, tm_min
=
49
, tm_sec
=
4
, tm_wday
=
4
, tm_yday
=
68
, tm_isdst
=
0
)
>>> time.localtime(time.time())
time.struct_time(tm_year
=
2018
, tm_mon
=
3
, tm_mday
=
10
, tm_hour
=
0
, tm_min
=
49
, tm_sec
=
14
, tm_wday
=
5
, tm_yday
=
69
, tm_isdst
=
0
)
>>>
|
此程序的說明:注意time.gmtime()與time.localtime()的對比
Time.time()為獲取一個時間戳,需要明確 時間戳其實就是utc與1970的時間差
Time.gmtime(time.time())將時間戳轉換為utc九元組
Time.localtime(time.time())將時間戳轉換為本地時間的九元組,實際就是轉換為標准的九元組后,根據timezone進行換算的
5.5 如何取用時間struct_time-9元組的值
時間元組賦值給變量,變量用.來引用
|
1
2
3
4
5
6
7
8
9
10
11
|
import
time
x
=
time.gmtime()
print
(x)
print
(x.tm_year,x.tm_yday)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
time.struct_time(tm_year
=
2018
, tm_mon
=
2
, tm_mday
=
26
, tm_hour
=
17
, tm_min
=
22
, tm_sec
=
23
, tm_wday
=
0
, tm_yday
=
57
, tm_isdst
=
0
)
2018
57
|
5.6 strftime()
將元組轉換為標准格式輸出
這里的元組默認為localtime,如果給出元組,則從元組中取值
Time.strftime(格式,元組)
|
1
2
3
|
>>> time.strftime(
'%Y %m %d %X'
)
'2018 02 10 01:21:43'
|
5.7 strptime()
將文本格式轉換為元組
Time.strptime(文本,格式)
|
1
2
3
4
5
|
>>> time.strptime(
'2018 02 10 01:21:43'
,
'%Y %m %d %X'
)
time.struct_time(tm_year
=
2018
, tm_mon
=
2
, tm_mday
=
10
, tm_hour
=
1
, tm_min
=
21
, tm_sec
=
43
, tm_wday
=
5
, tm_yday
=
41
, tm_isdst
=
-
1
)
>>>
|
注意:tm_isdst這個部分,轉換之后夏令時為-1
5.8 Time.ctime(時間戳)
會轉換為本地時區的 文本形式時間
|
1
2
3
|
>>> time.ctime(time.time())
#默認傳入time.time()
'Sat Mar 10 01:31:45 2018'
|
5.9 Time.asctime(time.localtime())默認傳入localtime
從元組取值轉換成固定的格式輸出,和strftime類似
|
1
2
3
4
5
6
7
8
9
10
11
|
>>> time.asctime(time.gmtime())
'Fri Mar 9 17:33:26 2018'
>>> time.asctime(time.localtime())
'Sat Mar 10 01:33:32 2018'
>>> time.asctime()
'Sat Mar 10 01:33:39 2018'
|
5.10 time.mktime() -- convert local time tuple to seconds since Epoch
把本地的時間的元組轉換為時間戳
Localtime->轉換為標准的時間戳->utc->local
|
1
2
3
4
5
|
>>> time.localtime(time.mktime(time.localtime()))
time.struct_time(tm_year
=
2018
, tm_mon
=
3
, tm_mday
=
10
, tm_hour
=
1
, tm_min
=
37
, tm_sec
=
31
, tm_wday
=
5
, tm_yday
=
69
, tm_isdst
=
0
)
>>>
|
5.11 tzset() -- change the local timezone
改變timezone變量,調整時區,一般不使用


三、datetime模塊的使用
1、獲取當前時間的方法 datetime.datetime.now()
以字符串形式輸出
|
1
2
3
|
print
(datetime.datetime.now())當前時間
2018
-
01
-
04
02
:
11
:
37.867479
|
2、知道datetime.datetime.now()的類型
|
1
|
<
class
'datetime.datetime'
>
|
3、定義輸出格式 與strftime結合
|
1
2
3
4
5
6
7
|
print
(datetime.datetime.now())
print
(datetime.datetime.now().strftime(
'%Y-%m-%d %H:%M:%S'
))<br>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
2018
-
03
-
10
09
:
46
:
28.106559
2018
-
03
-
10
09
:
46
:
28
|
4、str格式時間轉成datetime.datetime類
|
1
2
3
4
5
6
7
8
|
d1
=
datetime.datetime.strptime(
'2015-03-05 17:41:20'
,
'%Y-%m-%d %H:%M:%S'
)
d2
=
datetime.datetime.strptime(
'2015-03-02 17:31:20'
,
'%Y-%m-%d %H:%M:%S'
)
Print
(d1)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
2015
-
03
-
05
17
:
41
:
20
|
5、計算時間差的方法
|
1
2
3
4
5
6
7
8
9
10
11
|
for
i
in
range
(
20
):
d3
=
datetime.datetime.now()
print
(d3
-
d1)
time.sleep(
1
)<br>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
2015
-
03
-
05
17
:
41
:
20
1100
days,
16
:
05
:
16.123119
|
6、與time.timedelta()結合計算時間
|
1
2
3
4
5
6
7
|
print
(d1
+
datetime.timedelta(
3
)) 三天后的時間
print
(d1
+
datetime.timedelta(
-
3
)) 三天前的時間
Primt(datetime.now
+
datetime.timedelta(hour
=
3
)) 三小時后的時間
Primt(datetime.now
+
datetime.timedelta(second0
=
-
3
)) 三秒前的時間
|
7、時間的修改與替換
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
nownow
=
datetime.datetime.now()
print
(
type
(nownow))
nownow.replace(year
=
1999
)
print
(nownow,nownow.replace(year
=
1999
))
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
<
class
'datetime.datetime'
>
2018
-
01
-
04
02
:
31
:
29.952321
1999
-
01
-
04
02
:
31
:
29.952321
|
注意:除非重新賦值給新的變量 不然replace不會去改變變量本身 和字符串類似
四、random 模塊,隨機數模塊的使用
1、random.random()
生成隨機浮點數范圍在0-1之間 包括0不包括1
|
1
2
|
>>> random.random()
0.11288859525093142
|
2、random.randint()
生成隨機整數,前數字都包含,即生成的隨機數前后數字都可能出現
|
1
2
3
4
5
6
|
>>> random.randint(
1
,
4
)
1
>>> random.randint(
1
,
4
)
3
>>> random.randint(
1
,
4
)
4
|
3、random.randrange()
顧頭不顧尾的range,可以設置步長,不設置step 則step為1.
randint不能設置步長step
|
1
2
3
4
5
6
|
>>> random.randrange(
0
,
11
,
2
)
4
>>> random.randrange(
0
,
11
,
2
)
8
>>> random.randrange(
0
,
11
,
2
)
0
|
4、random.choice()
放入一個非空序列 列表 字符串 元組(有序的,放入字典、集合會報錯)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> random.choice((
1
,
2
,
3
,
4
))
#元組
3
>>> random.choice((
1
,
2
,
3
,
4
))
2
>>> random.choice([
'a'
,
'b'
,
'c'
])
'c'
>>> random.choice([
'a'
,
'b'
,
'c'
])
'a'
>>> random.choice(
'python'
)
#字符串
'y'
>>> random.choice(
'python'
)
'o'
|
5、random.sample()取多個,與choice類似,choice取1個,sample取多個
放入一個非空序列,第二個參數表示抽取多少個,組成列表
|
1
2
3
4
|
>>> random.sample([
'a'
,
'b'
,
'c'
],
2
)
[
'b'
,
'c'
]
>>> random.sample(
'python'
,
6
)
[
'o'
,
't'
,
'h'
,
'p'
,
'y'
,
'n'
]
|
6、random.uniform() 指定區間的浮點數
和random.random做對比 random只是0和1之間
|
1
2
3
4
|
>>> random.uniform(
1
,
4
)
1.5855347763788947
>>> random.uniform(
1
,
4
)
3.890550444129729
|
7、洗牌功能 random.shuffle()對列表進行亂序
同時要注意是他可以直接改變列表 不需要重新賦值出來
|
1
2
3
4
5
|
>>> a
=
[
1
,
2
,
3
,
4
]
>>> random.shuffle(a)
>>> a
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
[
4
,
1
,
3
,
2
]
|
8、生成驗證碼的程序一則
思路
random.randint(0-9)
random.randint(65-90)
Chr(數字)->字符
字符串相加 ‘abc’+’d’=’abcd’
|
1
2
3
4
5
6
7
8
9
10
|
def
yanzheng():
yanzhengma
=
''
for
i
in
range
(
4
):
shuzi_or_zimu
=
random.randint(
0
,
1
)
if
shuzi_or_zimu:
yanzhengma
+
=
str
(random.randint(
0
,
9
))
else
:
yanzhengma
+
=
chr
(random.randint(
65
,
90
))
print
(yanzhengma)<br>
for
i
in
range
(
5
):
yanzheng()<br>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
|
1F47 YR31 R80M 66FG F6GS
五、os模塊
os模塊分兩個部分來講:1、 常用函數 2、os.path
(一)os的常用函數
1、os.getcwd() 相當於pwd
獲取當前python程序運行的路徑 你這個.py文件在哪 他就顯示哪
2、os.chdir()
相當於linux的cd 到相應目錄項進行操作
注意的是chdir的時候
對於目錄\的兩種處理方式
2.1、\\
2.2、r
>>> os.getcwd()
'C:\\Users\\Raytine' >>> os.chdir('d:\') File "<stdin>", line 1 os.chdir('d:\') ^ SyntaxError: EOL while scanning string literal >>> os.chdir('d:\\') >>> os.getcwd() 'd:\\' >>> os.chdir(r'c:\') File "<stdin>", line 1 os.chdir(r'c:\') ^ SyntaxError: EOL while scanning string literal >>> os.chdir(r'c:\\') >>> os.chdir(r'c:\a') >>> os.getcwd() 'c:\\a'
注意:為什么>>> os.chdir(r'c:\')報錯 ,os.chdir(r'c:\')
3、os.curdir 當前目錄 os.pardir 上一級目錄
>>> os.curdir #只是個變量,並不能引用
'.' >>> os.curdir '.' >>> os.pardir
注意點: os.curdir 和os.pardir 都沒有()引用,不是函數
4、os.makedirs(r'c:\a\b\c') 遞歸創建
5、os.removedirs(r'c:\a\b\c')遞歸刪除
刪除原則:目錄為空繼續刪,不能用來刪文件及刪除非空目錄
>>> os.removedirs(r'c:\a\b\1.txt') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "D:\Python36\lib\os.py", line 238, in removedirs rmdir(name) NotADirectoryError: [WinError 267] #目錄名稱無效。: 'c:\\a\\b\\1.txt' >>> os.removedirs(r'c:\a\b\c') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "D:\Python36\lib\os.py", line 238, in removedirs rmdir(name) OSError: [WinError 145] #目錄不是空的。: 'c:\\a\\b\\c' >>> os.removedirs(r'c:\a\b\c')
6、os.mkdir() 創建目錄
不會遞歸,如果前面不存在則創建不成功
7、os.rmdir()刪除目錄
不會遞歸,為空刪除
8、os.listdir(os.curdir)
列出文件夾下面的所有文件 以列表形式列出
>>> os.listdir('.') ['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'python.pdb' ]
9、os.remove('filename') 刪除文件
10、os.rename('oldname','newname')
可以改文件夾名字以及文件的名字
>>> os.makedirs(r'c:a\b\c\d') >>> os.rename(r'c:a\b\c\d',r'c:a\b\c\e')
11、os.stat() 查看文件的屬性
>>> os.stat(r'c:a\b\c\e') os.stat_result(st_mode=16895, st_ino=1125899906960658, st_dev=2766884258, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1519743765, st_mtime=1519743765, st_ctime=1519743765)
12 os.sep 路徑分隔符 windows \\ linux /
13 os.linesep 換行符 windows \r\r linux \n
14 os.pathsep 分割文件路徑的分隔符 ;
>>> os.pathsep
';' >>> os.linesep '\r\n' >>> os.sep '\\' >>>
注意點:都沒有括號引用
15、os.environ 輸出系統的環境變量 為一個字典
和sys.path 不同 sys.path為python的環境變量
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\linyuming.ESG\\AppData\\Roaming', 'WINDIR': 'C:\\Windows'})
16.os.name 系統名稱
windows 為‘nt’ 獲取系統name針對不同系統做不同操作,增加兼容性
Windows,它是'nt',而對於Linux/Unix用戶,它是'posix'。
>>> os.name
'nt'
17.os.system() 用來執行系統指令
>>> os.system('dir') 驅動器 D 中的卷沒有標簽。 卷的序列號是 D2E8-6B21 D:\Python36 的目錄 2017/12/19 02:50 <DIR> . 2017/12/19 02:50 <DIR> .. 2017/12/19 02:50 <DIR> DLLs 2017/12/19 02:50 <DIR> Doc 2017/12/19 02:48 <DIR> include2017/12/19 02:50 <DIR> libs
(二)os.path 模塊
1、os.path.abspath()
獲取文件的絕對路徑
2、os.path.split() 切割文件路徑
切割成目錄+文件的形式
print(os.path.split(r'c:\a\b\c\d')) #不論文件是否存在 ('c:\\a\\b\\c', 'd')# 返回二元組,第一部分為目錄 第二部分為文件名 #Split=dirname+basename
3、os.path.dirname(r'c:\a\b\c\d.txt')獲取文件的目錄
不論這個文件是否存在,實質就是切割路徑
4 、os.path.basename(r'c:\a\b\c\d.txt') 獲取文件名
這個和dirname相對,basename只取文件名
>>> os.path.dirname(r'c:\a\b\c\d.txt') 'c:\\a\\b\\c' >>> os.path.basename(r'c:\a\b\c\d.txt') 'd.txt' >>> os.path.split(r'c:\a\b\c\d.txt') ('c:\\a\\b\\c', 'd.txt') #linux windows 對於路徑分隔符定義不通 所以運行結果有區別 #上面的路徑都可以不存在
5、os.path.exists()判斷路徑是否存在
可以判斷文件 或者文件夾
>>> os.path.exists(r'c:\a\b\c\d.txt') False
6、os.path.is* 判斷
>>> os.path.isfile(r'c:\a\123') False #文件不存在 false >>> os.path.isfile(r'c:\a\b') False #不是文件 false >>> os.path.isfile(r'c:\a\b\1.txt') True #存在且是文件 true
>>> os.path.isabs(r'c:\\') True >>> os.path.isabs(r'c:') False #寫的格式不對,不是絕對路徑則返回false >>> os.path.isabs(r'c:\\ajsdfiouoiw') True #不存在也返回true
isabs(s)
Test whether a path is absolute
isdir = _isdir(path, /)
Return true if the pathname refers to an existing directory.
isfile(path)
Test whether a path is a regular file
islink(path)
Test whether a path is a symbolic link.
This will always return false for Windows prior to 6.0.
ismount(path)
Test whether a path is a mount point (a drive root, the root of a
share, or a mounted volume)
7、os.path.join 將多個名字組合成路徑
拼接過程不能帶分割符 不然會出現問題
>>> os.path.join('root','tmp','abc') 'root/tmp/abc' >>> os.path.join(r'/','root','tmp','abc') '/root/tmp/abc'
8、getatime/getctime獲取文件的時間
>>> time.localtime(os.path.getatime(r'c:\a\b\1.txt')) time.struct_time(tm_year=2018, tm_mon=2, tm_mday=27, tm_hour=23, tm_min=33, tm_sec=57, tm_wday=1, tm_yday=58, tm_isdst=0) os.path.getatime(file) #輸出最近access訪問時間1318921018.0 os.path.getctime(file) #輸出文件create創建時間 os.path.getmtime(file) #輸出最近修改時間 #返回的是時間戳

六、sys模塊-和解釋器相關的信息及操作
該部分內容較少。
sys.version 獲取python解釋器的版本信息
sys.stdout 標准輸出
sys.argv 獲取參數 第一個參數是py文件路徑
sys.exit()標准退出exit(0)
print(sys.version)#輸出python的信信息 print(sys.argv)#用來獲取參數 第一個元素是程序路徑 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] ['F:/my_python_file/20180113_sys_shutil.py']

