1絮记、文件的介紹
文件:就是以硬盤為載體珊拼,存儲計算機所產(chǎn)生的數(shù)據(jù)
學習文件的目的:把程序中所產(chǎn)生的數(shù)據(jù)保存到文件鹦牛,能夠讓數(shù)據(jù)永久存儲
永久存儲的方式:
- 文件
- 數(shù)據(jù)庫,讀寫性能非臣顾瑁快,效率更高
2栅受、文件的讀取
文件的讀取方式為:
r
模式:以字符串的方式讀取文件中的數(shù)據(jù)rb
模式:以二進制(字節(jié))的方式讀取文件中的數(shù)據(jù)
r 模式
# 第一步:打開文件
file = open("test.txt", "r", encoding="utf-8")
# 查看打開文件使用的編碼格式
# cp936 => gbk
print(file.encoding)
# 第二步:讀取文件中的數(shù)據(jù)
result = file.read() # 讀取文件中的所有數(shù)據(jù)
print(result, type(result))
# 第三步: 關閉文件
file.close()
運行結果:
utf-8
人生苦短将硝,我用python!
人生苦短恭朗,我用python!
人生苦短,我用python!
<class 'str'>
r模式的注意點
- 要打開的文件必須存在袋哼,否則就崩潰
- 打開文件默認是在當前工程目錄下面,如果打開的文件沒有在當前工程里面闸衫,需要加上文件的路徑
- 在
window
的python
解釋器下面涛贯,打開文件默認使用的是gbk
編碼,mac
或者Linux
的python
解釋器蔚出,打開文件默認是utf-8
- 在
rb 模式 — 以二進制(字節(jié))的方式讀取文件中的數(shù)據(jù)
比如:視頻弟翘,圖片,音頻等數(shù)據(jù)需要使用
rb
模式讀取文件中的數(shù)據(jù)
打開一張圖片:
# # 第一步:打開文件
file = open("11.png", "rb")
# # 第二步:讀取文件中的數(shù)據(jù)
result = file.read()
print(result, type(result))
# # 第三步:關閉文件
file.close()
運行結果是一行特別長的二進制代碼骄酗,我簡化一下展示:
b'\xe4\xba\xba\xa8python!\r\n' <class 'bytes'>
注意:數(shù)據(jù)前帶b
表示字節(jié)數(shù)據(jù)或者二進制數(shù)據(jù)
rb
模式讀取文本文件中的數(shù)據(jù):
# 第一步:打開文件
file = open("test.txt", "rb")
# 第二步:讀取文件中的數(shù)據(jù)
result = file.read()
print(result, type(result))
# 需要對二進制數(shù)據(jù)進行解碼稀余,轉成字符串數(shù)據(jù)
content = result.decode("utf-8")
print(content, type(content))
# 第三步:關閉文件
file.close()
運行結果:
b'\xe4\xba\xba\xe7\x94\x9f\xa8python!\r\n' <class 'bytes'>
人生苦短,我用python!
人生苦短趋翻,我用python!
人生苦短睛琳,我用python!
<class 'str'>
3、文件的寫入
向文件寫入數(shù)據(jù)的操作為:
-
w
模式: 以字符串的方式寫入數(shù)據(jù)
-
-
wb
模式: 以二進制(字節(jié))的方式寫入數(shù)據(jù)
-
w模式
# 第一步:打開文件
file = open("2.txt", "w", encoding="utf-8")
# 查看打開文件踏烙,操作文件的編碼格式
print(file.encoding)
# 第二步: 向文件中寫入數(shù)據(jù)(字符串)
file.write("hello\n")
file.write("world\n")
file.write("哈哈")
# 第三步: 關閉文件
file.close()
w模式的注意點:
- 當打開的文件不存在時师骗,默認會創(chuàng)建一個指定的文件
- 當打開的文件存在時,先把原文件中的所有數(shù)據(jù)清空讨惩,然后再寫入指定的數(shù)據(jù)
wb模式 — 以二進制(字節(jié))的方式寫入數(shù)據(jù)
# 第一步:打開文件
file = open("2.txt", "wb")
# 第二步: 向文件中寫入數(shù)據(jù)(字符串)
content = "哈哈"
# 把字符串編碼成二進制(字節(jié))也就是把字符串轉成二進制
content_data = content.encode("utf-8")
file.write(content_data)
# 第三步: 關閉文件
file.close()
4辟癌、文件的追加寫入
- a模式: 以字符串的方式追加寫入數(shù)據(jù)
- ab模式: 以二進制(字節(jié))的方式追加寫入數(shù)據(jù)
a模式 — 以字符串的方式追加寫入數(shù)據(jù)
# 第一步:打開文件
file = open("3.txt", "a", encoding="utf-8")
# 第二步: 追加寫入數(shù)據(jù)(字符串數(shù)據(jù))
file.write("嘻嘻")
# 第三步: 關閉文件
file.close()
a模式的注意點:
- 當打開的文件不存在時,那么默認會創(chuàng)建一個指定的文件
- 當打開的文件存在時荐捻,原文件中的數(shù)據(jù)會進行保留黍少,在原文件數(shù)據(jù)的末尾追加寫入指定的數(shù)據(jù)
ab模式 - 以二進制(字節(jié))的方式追加寫入數(shù)據(jù)
# 第一步:打開文件
file = open("3.txt", "ab")
# 第二步: 追加寫入數(shù)據(jù)(二進制數(shù)據(jù))
content = "哈哈"
# 對字符串進行編碼,把字符串轉成二進制數(shù)據(jù)(字節(jié)數(shù)據(jù))
data = content.encode("utf-8")
print(type(data))
file.write(data)
# 第三步: 關閉文件
file.close()
5处面、文件讀取數(shù)據(jù)的其他常用方法
- read方法厂置,需要指定參數(shù)
- readline方法:讀取一行數(shù)據(jù)
- readlines方法:讀取所有行數(shù)據(jù)
read方法帶有參數(shù)的使用
read(數(shù)據(jù)長度):如果文件的操作模式是r模式,這里的數(shù)據(jù)長度是字符串的數(shù)據(jù)長度
file = open("test.txt", "r", encoding="utf-8")
#6:表示讀取6個字符串數(shù)據(jù)的長度
result = file.read(6)
print(result)
file.close()
運行結果:
人生苦短魂角,我
read(數(shù)據(jù)長度):如果文件的操作模式是rb模式农渊,這里的數(shù)據(jù)長度是字節(jié)的數(shù)據(jù)長度。
提示:在utf-8編碼格式下或颊,一個漢字占用三個字節(jié)砸紊,一個字母,數(shù)字占用1個字節(jié)
file = open("test.txt", "rb")
### 3:表示讀取3個字節(jié)數(shù)據(jù)的長度
# 提示:在utf-8編碼格式下囱挑,一個漢字占用三個字節(jié)醉顽,一個字母,數(shù)字占用1個字節(jié)
result = file.read(3)
print(result)
# 對二進制數(shù)據(jù)進行解碼轉成字符串
content = result.decode("utf-8")
print(content)
result = file.read(3)
print(result)
# 對二進制數(shù)據(jù)進行解碼轉成字符串
content = result.decode("utf-8")
print(content)
file.close()
運行結果:
b'\xe4\xba\xba'
人
b'\xe7\x94\x9f'
生
readlines方法:讀取所有行數(shù)據(jù)
file = open("test.txt", "r", encoding="utf-8")
# 讀取文件中的所有行數(shù)據(jù)
result = file.readlines()
print(result, type(result))
for row in result:
print(row)
file.close()
運行結果:
['人生苦短平挑,我用python!\n', '人生苦短游添,我用python!\n', '人生苦短系草,我用python!\n'] <class 'list'>
人生苦短,我用python!
人生苦短唆涝,我用python!
人生苦短找都,我用python!
readline方法:讀取一行數(shù)據(jù)
file = open("test.txt", "r", encoding="utf-8")
# 讀取文件中的一行數(shù)據(jù)
result = file.readline()
print(result, type(result))
for row in result:
print(row)
file.close()
運行結果:
人生苦短,我用python!
<class 'str'>
人
生
苦
短
廊酣,
我
用
p
y
t
h
o
n
!
with語句的使用
文件使用完后必須關閉能耻,因為文件對象會占用操作系統(tǒng)的資源,并且操作系統(tǒng)同一時間能打開的文件數(shù)量也是有限的亡驰,文件在讀寫時都有可能產(chǎn)生IOError
晓猛,一旦出錯,后面的f.close()
就不會調用凡辱。Python提供了 with 語句的這種寫法戒职,既簡單又安全,并且 with 語句執(zhí)行完成以后自動調用關閉文件操作透乾,即使出現(xiàn)異常也會自動調用關閉文件操作洪燥。
with 語句的示例代碼:
# 1.以寫的方式打開文件
with open("1.txt", "w") as f:
# 2.讀取文件內容
f.write("hello world")
6、文件的拷貝
我們想把原文件test.txt
拷貝一份為test[復件].txt
:
# 原文件的名字
src_file_name = "test.txt"
# 根據(jù)點把原文件的名字分割成三部分
file_name, point, end_str = src_file_name.partition(".")
# 生成目標文件的名字 test[復件].txt
dst_file_name = file_name + "[復件]" + point + end_str
print(dst_file_name)
# 1. 打開目標文件(拷貝后的文件 test[復件].txt)
dst_file = open(dst_file_name, "wb")
# 2. 打開原文件乳乌,讀取原文件中的數(shù)據(jù)
src_file = open(src_file_name, "rb")
# 讀取原文件中的所有二進制數(shù)據(jù)
src_file_data = src_file.read()
# 3. 把讀取到的原文件數(shù)據(jù)寫入到目標文件(拷貝后的文件 test[復件].txt)
dst_file.write(src_file_data)
# 4. 把文件關閉
src_file.close()
dst_file.close()
大文件拷貝
# 原文件的名字
src_file_name = "test.txt"
# 根據(jù)點把原文件的名字分割成三部分
file_name, point, end_str = src_file_name.partition(".")
# 生成目標文件的名字 test[復件].txt
dst_file_name = file_name + "[復件]" + point + end_str
print(dst_file_name)
# 1. 打開目標文件(拷貝后的文件 test[復件].txt)
dst_file = open(dst_file_name, "wb")
# 2. 打開原文件蚓曼,讀取原文件中的數(shù)據(jù)
src_file = open(src_file_name, "rb")
while True:
# 讀取原文件中的所有二進制數(shù)據(jù)
src_file_data = src_file.read(1024) # 每次讀取最大字節(jié)數(shù)是1024
# if len(src_file_data) > 0:
# if 判斷的簡寫
if src_file_data:
# 3. 把讀取到的原文件數(shù)據(jù)寫入到目標文件(拷貝后的文件 test[復件].txt)
dst_file.write(src_file_data)
else:
print("文件拷貝完畢")
# 提示:如果讀取到數(shù)據(jù)長度是0表示文件讀取完成
break
# 4. 把文件關閉
src_file.close()
dst_file.close()
if 判斷的擴展
- if語句結合 bool 類型
- if語句結合容器類型
- if語句結合非零即真
- if語句結合 None
if語句結合 bool 類型
if False:
print("ok")
else:
print("error")
運行結果:
error
if語句結合容器類型
說明:如果
if
語句結合容器類型使用,容器類型里面有數(shù)據(jù)表示條件成立钦扭,否則容器類型里面沒有數(shù)據(jù)表示條件失敗
容器類型:字符串纫版,列表,元組客情,字典其弊,集合,range, 二進制
if語句結合字符串:
my_value = "b"
if my_value:
print("ok")
else:
print("error")
################ 運行結果 ################
ok
if語句結合range:
my_range = range(0)
if my_range:
print("ok")
else:
print("error")
################ 運行結果 ################
error
if語句結合集合:
my_set = set()
if my_set:
print("ok")
else:
print("error")
################ 運行結果 ################
error
if語句結合列表:
my_list = [1,3,5]
if my_list:
print("ok")
else:
print("error")
################ 運行結果 ################
ok
7膀斋、文件和文件夾的相關操作
操作文件和文件夾的模塊:
import os
文件和文件夾操作的高級模塊:
import shutil
創(chuàng)建空的文件
file = open("abcd.txt", "wb")
file.close()
重命名
import os
###將abcd.txt文件重命名為aaa.txt
os.rename("abcd.txt", "aaa.txt")
刪除文件
import os
os.remove("1.txt")
創(chuàng)建文件夾
import os
os.mkdir("AAA")
查看當前操作目錄的路徑
import os
path = os.getcwd()
print(path)
切換目錄
import os
os.chdir("AAA")
path = os.getcwd()
print(path)
切換到上一級路徑
import os
os.chdir("..")
path = os.getcwd()
print(path)
刪除文件
import os
os.remove("AAA/abcd.txt")
刪除非空文件夾
import os
os.rmdir("CCC")
刪除空目錄
import os
os.rmdir("BBB")
刪除非空目錄
import shutil
shutil.rmtree("CCC")
查看目錄下的所有文件名
import os
# 默認查看當前目錄下的所有文件名
result = os.listdir() #等價于 result = os.listdir(".")
print(result)
查看指定目錄下的所有文件名
import os
result = os.listdir("CCC")
print(result)
判斷指定文件是否存在
import os
result = os.path.exists("4.txt")
print(result)
判斷指定文件夾是否存在
import os
result = os.path.exists("AA")
print(result)
獲取指定文件的文件名和文件的后綴
import os
file_name, end_str = os.path.splitext("3.txt")
print(file_name, end_str)
判斷是否是文件
import os
result = os.path.isfile("DD")
print(result)
判斷是否是文件夾
import os
result = os.path.isdir("3.txt")
print(result)
批量修改文件名
我們把
test
目錄下的所有文件名前面都加上一個[黑馬出品]-
:
import os
# 1. 獲取指定目錄下的所有文件名
file_name_list = os.listdir("test")
print(file_name_list)
# 切換到test目錄里面
path = os.getcwd()
print(path)
os.chdir("test")
path = os.getcwd()
print(path)
# 2. 遍歷文件名列表獲取每一個文件名梭伐,然后依次對文件進行重命名
for file_name in file_name_list:
# 生成重命名后的文件名
rename_file_name = "[黑馬出品]-" + file_name
print(file_name, rename_file_name)
# 使用rename函數(shù)進行重命名
os.rename(file_name, rename_file_name)
學生管理系統(tǒng)文件版
# 學生管理系統(tǒng)的分析:
# 1. 每個學生的信息使用字典進行存儲
# 2. 對于學生管理系統(tǒng),是需要管理不同學生的仰担,所以學生管理系統(tǒng)里面需要在定義列表糊识,使用列表管理不同的學生字典信息
import os
# 定義全局變量的學生列表
student_list = []
# 顯示學生管理系統(tǒng)的功能菜單
def show_menu():
print("--------------學生管理系統(tǒng)V1.0------------")
print("1. 添加學生")
print("2. 修改學生")
print("3. 刪除學生")
print("4. 查詢學生")
print("5. 顯示所有學生")
print("6. 退出")
# 添加學生
def add_student():
name = input("請輸入學生的姓名:")
age = input("請輸入學生的年齡:")
sex = input("請輸入學生的性別:")
# 使用字典存儲每個學生的信息
student_dict = {}
# 添加鍵值對
student_dict["name"] = name
student_dict["age"] = age
student_dict["sex"] = sex
# 把學生字典添加到學生列表里面
student_list.append(student_dict)
print("添加成功")
# 顯示所有學生的信息
def show_all_students():
# 遍歷學生列表,顯示每一個學生信息
for index, student_dict in enumerate(student_list):
# 學號 = 下標 + 1
student_no = index + 1
print("學號: %d 姓名: %s 年齡: %s 性別: %s" % (student_no,
student_dict["name"],
student_dict["age"],
student_dict["sex"]))
# 修改學生信息
def modify_student():
# 接收用戶輸入學生的學號
student_no = int(input("請輸入您要修改學生的學號:"))
# 計算學生列表的下標 = 學號 - 1
index = student_no - 1
# 判斷下標的范圍是否是一個合法的范圍
if index >= 0 and index < len(student_list):
# 根據(jù)下標獲取對應的學生字典信息
student_dict = student_list[index]
# 重新接收用戶輸入的學生信息
new_name = input("請輸入修改后學生的姓名:")
new_age = input("請輸入修改后學生的年齡:")
new_sex = input("請輸入修改后學生的性別:")
# 修改字典信息
student_dict["name"] = new_name
student_dict["age"] = new_age
student_dict["sex"] = new_sex
print("修改成功")
else:
print("請輸入合法的學號摔蓝!")
# 刪除學生信息
def remove_student():
# 接收用戶輸入學號
student_no = int(input("請輸入要刪除學生的學號:"))
# 根據(jù)學號計算學生的下標
index = student_no - 1
# 判斷下標的范圍是否是一個合法的范圍
if index >= 0 and index < len(student_list):
# 根據(jù)下標刪除對應的學生信息
del student_list[index]
print("刪除成功")
else:
print("請輸入合法的學號赂苗!")
# 查詢學生
def query_student():
# 接收用戶輸入的學生姓名
name = input("請輸入要查詢學生的姓名:")
# 遍歷列表獲取每一個學生字典信息
for index, student_dict in enumerate(student_list):
if student_dict["name"] == name:
# 生成學生的學號
student_no = index + 1
# 代碼執(zhí)行到此,說明找到了學生信息
print("學號: %d 姓名: %s 年齡: %s 性別: %s" % (student_no,
student_dict["name"],
student_dict["age"],
student_dict["sex"]))
break
else:
print("對不起贮尉,您查找的學生信息不存在!")
# 保存列表數(shù)據(jù)到文件
def save_data():
# 1. 打開文件
file = open("student_list.data", "w", encoding="utf-8")
# 2. 把列表數(shù)據(jù)轉成字符串保存到文件
student_list_str = str(student_list)
print(student_list_str, type(student_list_str))
file.write(student_list_str)
# 3. 關閉文件
file.close()
# 加載緩存文件中的數(shù)據(jù)
def load_data():
# 1. 判斷緩存文件是否存在
if os.path.exists("student_list.data"):
# 2. 如果緩存文件存在拌滋,讀取文件中的數(shù)據(jù)
file = open("student_list.data", "r", encoding="utf-8")
file_data = file.read()
# 3. 把讀取到數(shù)據(jù)給全局變量(student_list)
# "[{'name': '李四', 'age': '20', 'sex': '男'}, {'name': '王五', 'age': '20', 'sex': '男'}]"
# 如果字符串列表轉成列表
new_student_list = eval(file_data)
# 把讀取到列表中的每一個數(shù)據(jù)添加到全局變量列表里面
student_list.extend(new_student_list)
# 程序的入口函數(shù),程序第一個要執(zhí)行的函數(shù)
def start():
# 程序啟動后猜谚,加載文件中的數(shù)據(jù)只加載一次即可
load_data()
while True:
# 顯示學生管理系統(tǒng)的功能菜單
show_menu()
# 接收用戶輸入的功能選項
menu_option = input("請輸入您需要的功能選項:")
# 判斷功能選項
if menu_option == "1":
print("添加學生")
add_student()
elif menu_option == "2":
print("修改學生")
modify_student()
elif menu_option == "3":
print("刪除學生")
remove_student()
elif menu_option == "4":
print("查詢學生")
query_student()
elif menu_option == "5":
print("顯示所有學生")
show_all_students()
elif menu_option == "6":
print("退出")
# 把列表數(shù)據(jù)保存到文件败砂,可以做到永久存儲
save_data()
break
# 啟動學生管理系統(tǒng)
start()
# 快捷鍵:ctr + - 把函數(shù)的代碼折疊起來赌渣, ctr + + 把函數(shù)的代碼展開
# 快捷鍵:ctr + shift + - 把所有函數(shù)的代碼折疊起來, ctr + shift + + 把所有函數(shù)的代碼展開