時間模塊之datatime模塊、os模塊、sys模塊、json模塊、json模塊實操
一、模塊的絕對導入和相對導入
1.絕對導入:以執行文件所在的sys.path為起始路勁,然後一層一層向下找,如果不是用pycharm運行就會報錯,則需要將項目根目錄添加到sys.path
2.相對導入:以當前模板文件路徑為準,只能在模板文件中使用,不能在執行文件中使用,相對導入在項目中比較複雜的情況下可能會報錯,所以不推薦使用
二、包的概念
1.概念:內部含有雙下init.py的文件夾
2.作用:為了更加方便的管理模塊文件
3.使用:導入包名其實導入的是裏面的__
init__
.py文件,通過相對導入將其他模塊導入__
init__
.py文件中,然後在執行文件中通過點的方式使用模塊里的名字,也可以使用絕對路徑直接跨過__
init__
.py直接導入包裏面的模塊文件
三、編程思想的轉變
小白階段—->函數階段—->模塊階段
不斷地變化進步目的是為了更加方便快捷高效的管理資源
四、軟件開發目錄規範
根據我們的需求,高效的管理資源,分模塊文件多了之後還需要有文件夾
bin文件夾:用於存儲程序的啟動文件
conf文件夾:用於存儲程序的配置文件
core文件夾:用於存儲程序的核心邏輯,程序的功能
lib文件夾:用於存儲程序的公共功能
db文件夾:用於存儲程序的數據文件
log文件夾:用於存儲日誌文件
interface文件夾:用於存儲一些接口文件
readme文本文件:類似於說明書
requirements.txt文件:用於存儲程序所需的第三方模塊名稱和版本
五、常見的內置模塊
1.collections模塊
namedtuple(具名元組)、deque(雙端列表)、orderdict(有序字典)、defaultdict(默認值字典)、counter(計數器)
2.time模塊
時間戳 time.time()、結構化時間 time.gmtime()、格式化時間 time.strftime()
struct_time通過 strftime 轉變為Format string
Format string通過 strptime 轉變為struct_time
struct_time通過 mktime 轉變為Timestamp
Timestamp通過 localtime gmtime 轉變為struct_time
一、時間模塊之datatime模塊
1.datetime.datetime.today()
表示的是當前的時間 年月日時分秒 秒數精確到了後6位
import datetime
res = datetime.datetime.today() # 2022-07-15 15:28:26.400621
print(res)
2.datetime.date.today()
表示的是當前的時間 年月日
import datetime
res1 = datetime.date.today() # 2022-07-15
print(res1)
ps:想區分這倆個結果,就看中間的是datetime還是date,中間的是datetime那麼結果就是年月日時分秒,中間的是date那麼結果就是年月日
3.datetime.date.today()
時間差值,可以對時間進行換算,有以下參數 如果沒有的話可以通過已有的進行換算,已有的如下:
days: float = …, days: float = …, microseconds: float = …, milliseconds: float = …, minutes: float = …, hours: float = …, weeks: float = …。
res1 = datetime.date.today() # 2022-07-15
t1 = datetime.timedelta(days=3)
print(res1 + t1) # 2022-07-18
print(res1 - t1) # 2022-07-12
4.datetime.datetime.now()(不常用)
表示的是當前時間,與datetime.datetime.today()這個重複
print(datetime.datetime.now()) # 2022-07-15 16:05:17.480020
5.通過點的方式只取年或者月或者日等內置方法
import datetime
res = datetime.datetime.today()
print(res) # 2022-07-15 16:09:51.276748
print(res.day) # 15
print(res.year) # 2022
print(res.month) # 7
print(res.hour) # 16
print(res.minute) # 11
print(res.weekday()) # 4
print(res.isoweekday()) # 5
二、os模塊
os模塊是與操作系統交互的一個接口
1.os.mkdir
-
生成單級目錄,如果目錄存在的話就會報錯,提示該文件夾已經存在不能再次創建
-
不能創建多級目錄
import os
os.mkdir(r'aaa') # 創建了新的文件夾
os.mkdir(r'aaa') # 第二次創建的時候 FileExistsError: [WinError 183] 當文件已存在時,無法創建該文件。: 'aaa'
os.mkdir(r'bbb\ccc\ddd') # FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: 'bbb\\ccc\\ddd'
2.os.makedirs()
- 創建多級目錄 也可以創建單級目錄
os.makedirs(r'bbb\ccc\ddd')
os.makedirs(r'ccc')
3.os.rmdir()
- 可刪除單級目錄,但是這個目錄下面什麼都沒有才可以被刪除,也不可以刪除多級空目錄
os.rmdir(r'aaa')
4.os.removedirs()
-
對有數據的目錄不可以進行刪除
-
在多級目錄的情況下刪除的時候是從最底下的開始,然後一層一層向上檢查,如果到了那層有數據的時候,就不會刪除了,沒有的話就一層一層的進行刪除
os.removedirs(r'bbb')
os.removedirs(r'bbb\ccc\ddd')
5.os.listdir()
- 列出當前目錄下的所有文件和子目錄,包括隱藏文件,並以列表方式打印
- 可以進行指定目錄查看目錄下面所有文件和子目錄包括隱藏文件,並以列表方式打印
print(os.listdir()) # ['.idea', '01 時間模塊.py', '02 os模塊.py']
print(os.listdir(r'D:\\')) # ['$RECYCLE.BIN', 'BaiduNetdisk', 'BaiduNetdiskDownload', 'EVcapture', 'iQIYI', 'Notedpad++', 'PyCharm 2021.1.3', 'python27', 'Python38', 'pythonProject', 'PythonStudyContent', 'PythonsVideo', 'QQMusicCache', 'qycache', 'System Volume Information', 'Tencent', 'Typora', 'YouDao', '聲卡']
6.os.rename()
- 對文件進行修改名字
print(os.rename(r'a.txt', r'aaa.txt'))
7.os.remove()
- 刪除文件
print(os.remove(r'aaa.txt'))
8.os.getcwd()
- 獲取當前工作路徑,絕對路徑
print(os.getcwd()) # D:\pythonProject\day24
9.os.chdir()
- 切換路徑
print(os.getcwd()) # D:\pythonProject\day24
os.chdir(r'..')
print(os.getcwd()) # D:\pythonProject
10.os.path.abspath(__
file__
)(支持嵌套)
- 與程序啟動文件相關
- 當前項目如果放在其他計算機上,原來的絕對路徑可能會發生變化,沒有辦法確定項目文件所在的絕對路徑
- 如何怎加程序的兼容性? 使用os.path.dirname(os.path.dirname(file)) 嵌套可以提升層級
print(os.path.abspath(__file__)) # D:\pythonProject\day24\02 os模塊.py 獲取的是當前文件的絕對路徑
print(os.path.dirname(__file__)) # D:/pythonProject/day24 獲取的是當前文件所在的目錄路徑
import sys
sys.path.append(r'D:\pythonProject\day24\ATM')
# 這裡的絕對路徑換太電腦是沒有辦法確定它在哪
from core import src
src.run()
# 如何怎加程序的兼容性
res = os.path.dirname(__file__) # D:/pythonProject/day24/ATM/bin
res1 = os.path.dirname(os.path.dirname(__file__)) # D:/pythonProject/day24/ATM
sys.path.append(res1)
# 嵌套可以提升層級,嵌套一次提升一層,再嵌套一次又提升一層
11.os.path.exists()、os.path.isdir()、os.path.isfile()
- os.path.exists()前者判斷路徑是否存在 可以是文件可以是目錄,os.path.isdir()只適用於路徑是否為文件夾,os.path.isfile()只適用於路徑是否文件
- 返回的是布爾值
print(os.path.exists(r'ATM')) # True
print(os.path.exists(r'bbb')) # False
print(os.path.exists(r'01 時間模塊.py')) # True
print(os.path.isdir(r'ATM')) # True
print(os.path.isfile('01 時間模塊.py')) # True
12.os.path.join(path1[, path2[, …]])
- 將多個路徑拼接後返回,第一個絕對路徑之前的參數將被忽略
- 涉及到路徑拼接不要使用 + ,建議使用os模塊里的join方法,不同的操作系統路徑分隔符不一樣,如果使用的是『\』,那就只能在windows系統下使用了,join會自動識別當前在什麼系統下操作的,然後給予對應的分隔符
- windows—\,mac—/
relative_path = 'a.txt'
absolute_path = r'D:\pythonProject\day24\ATM\core'
'''拼接a.txt的絕對路勁'''
res = os.path.join(absolute_path, relative_path)
print(res) # D:\pythonProject\day24\ATM\core\a.txt
13.os.path.getsize(path)
- 獲取文件大小
- 以bytes為單位
print(os.path.getsize(r'01 時間模塊.py')) # 746
三、sys模塊
與os模塊可以稱之為兄弟模塊,sys模塊主要是跟python解釋器打交道
1.sys.path
- 當前執行文件所在的系統變量,結果是列表
import sys
print(sys.path) # ['D:\\pythonProject\\day24', 'D:\\pythonProject\\day24', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_display', 'D:\\Python38\\python38.zip', 'D:\\Python38\\DLLs', 'D:\\Python38\\lib', 'D:\\Python38', 'D:\\Python38\\lib\\site-packages', 'D:\\PyCharm 2021.1.3\\plugins\\python\\helpers\\pycharm_matplotlib_backend']
2.sys.version(了解)
import sys
print(sys.version) # 3.8.6 (tags/v3.8.6:db45529, Sep 23 2020, 15:52:53) [MSC v.1927 64 bit (AMD64)]
3.sys.platform(了解)
import sys
print(sys.platform) # win32
4.sys.argv
- 命令行參數List,第一個元素是程序本身路徑
res = sys.argv
if len(res) == 3:
username = res[1]
password = res[2]
if username == 'zhang' and password == '123':
print('您可以正在執行該文件')
else:
print('用戶名或密碼錯誤')
else:
print('請填寫用戶名和密碼')
四、json模塊
- json模塊也稱之為序列化模塊,是不同編程語言之間數據交互必備的模塊
- 不同編程語言之間數據類型存在差異,無法直接交互
- json模塊相當於是一個中間人,作為不同的編程語言之間數據類型先來到json這裡進行轉為為對方可是識別的數據類型然後再交給它
1.json格式的數據應該是什麼?
由於數據基於網絡傳輸肯定是二進制,那麼在python中只有字符串可以調用encode方法轉成二進制數據,所以json格式的數據也是字符串
2.json格式的數據的特徵是?
首先肯定是一個字符串 其次引號是標誌性的雙引號
import json
d = {'name': 'jason', 'pwd': 123}
res = json.dumps(d) # 序列化:將其他數據類型轉換為json格式字符串
print(res, type(res)) # {"name": "jason", "pwd": 123} <class 'str'>
res1 = json.loads(res) # 反序列化:將json格式字符串轉換成對應編程語言中的數據類型
print(res1, type(res1)) # {'name': 'jason', 'pwd': 123} <class 'dict'>
-
例題展示
# 方式一:使用json.dump(d, f),es = json.load(f)
import json
d = {'name': 'jason', 'pwd': 123}
with open(r'b.txt', 'w', encoding='utf8') as f:
json.dump(d, f) # 直接讓字典寫入文件(json自動幫你完成轉換)
with open(r'b.txt', 'r', encoding='utf8') as f:
res = json.load(f)
print(res, type(res))
# 方式二: 使用f.write(json.dumps(d)),res = json.loads(data)
import json
d = {'name': 'jason', 'pwd': 123}
with open(r'b.txt', 'w', encoding='utf8') as f:
f.write(json.dumps(d))
with open(r'b.txt', 'r', encoding='utf8') as f:
data = f.read()
res = json.loads(data)
print(res, type(res))
-
小結
dumps() 將其他數據類型轉換成json格式字符串
loads() 將json格式字符串轉化成對應的數據類型
dump() 將其他數據數據以json格式字符串寫入文件
load() 將文件中json格式字符串讀取出來並轉換成對應的數據類型
實現的需求是:不需要以拼接為字符串的形式去存儲數據,用的時候又得需要進行切割,使用json模塊後,可以直接存儲數據,然後使用的時候直接拿出來.get就可以使用
五、json模塊實操
涉及到用戶數據的存儲 可以單用戶單文件
1.涉及到用戶數據的存儲 可以單用戶單文件
jason.json
kevin.json
oscar.json
import json
import os
# 3.拼接用戶名文件對應的絕對路徑,用來打開文件,先把路徑存一下
base_dir = r'D:\pythonProject\day24\db'
# 1.獲取用戶的輸入
username = input('username:').strip()
# 4.獲取路徑下面所有的文件名,這裡獲取到的是用戶的用戶名
username_list = os.listdir(base_dir)
# 2.判斷用戶名是否存在
if username in username_list:
# 5.拼接文件的路徑,某一個文件的完整路徑
file_path = os.path.join(base_dir, username)
# 6.打開文件讀取文件
with open(file_path, 'r', encoding='utf8') as f:
data = json.load(f)
print(data, type(data))
# print(os.listdir(r'D:\pythonProject\day24\db'))
# 專門放置一個文件夾用來存放用戶的數據
# base_dir = os.path.dirname(__file__)
# db_path = os.path.join(base_dir,'db')
# 判斷路徑在不在 如果路徑不存在就會創建
# if not os.path.exists(db_path):
# os.mkdir(db_path)
# username = input('username>>>:').strip()
# password = input('password>>>:').strip()
# user_dict = {'username': username,
# 'password': password,
# 'balance': 15000,
# 'shop_car':[]
# }
# 將名字拼接起來,相當於在db下存儲文件,join是用來拼接文件路徑的
# file_path = os.path.join(db_path, '%s'%username)
# 不要文件的後綴會變得更簡單,用listdir的時候獲取到的就是數據名,判斷用戶名是否存在的時候,如果有的話將絕對路徑拼出來,就可以拿到用戶的數據了
# file_path = os.path.join(db_path, '%s.json'%username)
# with open(file_path,'w',encoding='utf8') as f:
# json.dump(user_dict, f)