時間模塊之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'

image-20220715163205047

image-20220715163745364

2.os.makedirs()

  • 創建多級目錄 也可以創建單級目錄
os.makedirs(r'bbb\ccc\ddd')
os.makedirs(r'ccc')

image-20220715164031815

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)
Tags: