您好,登錄后才能下訂單哦!
在python,使用open函數(shù),可以打開一個(gè)已經(jīng)存在的文件,或者創(chuàng)建一個(gè)新文件。
open(文件名,訪問模式) e.g. f = open('test.txt', 'w')
如果文件不存在那么創(chuàng)建,如果存在那么就先清空,然后寫入數(shù)據(jù)
要讀取二進(jìn)制文件,比如圖片、視頻等等,用'rb', 'wb', 'ab'等模式打開文件即可
seek(offset, from)有2個(gè)參數(shù): offset:偏移量 from:方向
0:表示文件開頭;
1:表示當(dāng)前位置;
2:表示文件末尾
1). 把位置設(shè)置為:從文件開頭,偏移5個(gè)字節(jié)
2). 把位置設(shè)置為:文件最開始
3). 把位置設(shè)置為:文件最末尾
#打開文件/etc/passwd, 默認(rèn)的打開模式是'r'
f = open('/etc/passwd')
print(f.read())
#io.UnsupportedOperation: not writable
#f.write('hello')
"""
##mode=r, 文件不存在,直接報(bào)錯(cuò); 只能read
##FileNotFoundError: [Errno 2] No such file or directory: 'doc/hello.txt'
#f = open('doc/hello.txt')
#print(f.read())
##mode=w, 1). 文件不存在,會(huì)自動(dòng)創(chuàng)建文件; 2). 只能write 3). 自動(dòng)清空文件內(nèi)容
#f = open('doc/hello.txt', mode='w')
##print("讀取文件中...", f.read())
##f.write('hello python\n')
##print("寫入成功......")
"""
mode=a+,
1). 文件不存在,會(huì)自動(dòng)創(chuàng)建文件;
2). r w
3). 文件追加并不會(huì)清空文件
"""
f = open('doc/world.txt', 'a+')
#移動(dòng)指針到文件最開始
f.seek(0, 0)
print(f.read())
#f.write('hello python\n')
print(f.closed)
print(f.mode)
print(f.name)
f.close()
print("關(guān)閉文件后.....")
print(f.closed)
print(f.mode)
print(f.name)
import os
os.path.exists('/etc/passwd')
Out[3]: True
os.path.exists('/etc/passwd1')
Out[4]: False
"""
import os
src_filename = input("要拷貝的文件: ")
#1). 判斷文件是否存在
if os.path.exists(src_filename):
dst_filename = input("目標(biāo)文件: ")
#2). mode='r'打開文件讀取文件內(nèi)容
#注意: 要讀取二進(jìn)制文件,比如圖片、視頻等等,用'rb', 'wb', 'ab'等模式打開文件即可.
src_f = open(src_filename, 'rb')
content = src_f.read()
#3). mode='r'打開文件寫入要拷貝的文件內(nèi)容
dst_f = open(dst_filename, 'wb')
dst_f.write(content)
#4). 關(guān)閉文件對(duì)象
src_f.close()
dst_f.close()
print('拷貝成功')
else:
print("要拷貝的文件%s不存在" %(src_filename))
from collections.abc import Iterable
f = open('/etc/passwd', 'r')
#當(dāng)文件比較小時(shí), 使用read、readlines方法讀取.
print(f.read())
print(''50)
#當(dāng)文件比較大時(shí), 使用readline方法讀取.
#將指針移動(dòng)到文件最開始, 然后指針向右移動(dòng)5個(gè)字節(jié)。
f.seek(5, 0)
print(f.readline())
print(f.readline())
print(''50)
#將指針移動(dòng)到文件最開始,
f.seek(0, 0)
print(f.readlines())
#名詞: 可迭代對(duì)象: 可以通過for循環(huán)遍歷的對(duì)象
#print("文件對(duì)象時(shí)可迭代對(duì)象嗎? ", isinstance(f, Iterable))
for index, line in enumerate(f):
print("第%s行" %(index+1), line)
"""
from collections.abc import Iterable
#需求: 將/etc/passwd文件后5行寫入doc/world.txt文件
f1 = open('/etc/passwd')
tail_five_line = f1.readlines()[-5:]
#print(tail_five_line)
#print(len(tail_five_line))
f2 = open('doc/world.txt', 'w')
f2.writelines(tail_five_line)
print("write ok")
"""
總結(jié):方法一: 調(diào)用close()方法關(guān)閉文件。文件使用完畢后必須關(guān)閉,因?yàn)槲募?duì)象會(huì)占用操作系統(tǒng)的資源,
并且操作系統(tǒng)同一時(shí)間能打開的文件數(shù)量也是有限的:
方法二: Python引入了with語句來自動(dòng)幫我們調(diào)用close()方法:
with語句工作原理:
python中的with語句使用于對(duì)資源進(jìn)行訪問的場(chǎng)合,
保證不管處理過程中是否發(fā)生錯(cuò)誤或者異常都會(huì)自動(dòng)
執(zhí)行規(guī)定的(“清理”)操作,釋放被訪問的資源,
比如有文件讀寫后自動(dòng)關(guān)閉、線程中鎖的自動(dòng)獲取和釋放等。
"""
#enter, exit
#f = open('xxxx')
with open('/etc/passwd') as f:
print('in with:', f.closed) # False
print(f.readlines()[-1])
print('out with:', f.closed) # True"""
os,語義為操作系統(tǒng),處理操作系統(tǒng)相關(guān)的功能,可跨平臺(tái)。 比如顯示當(dāng)前目錄下所
有文件/刪除某個(gè)文件/獲取文件大小......
? os模塊中的rename()可以完成對(duì)文件的重命名操作。
rename(需要修改的文件名, 新的文件名)
? os模塊中的remove()可以完成對(duì)文件的刪除操作
remove(待刪除的文件名)
import os
#1). 返回操作系統(tǒng)類型, 值為posix,是Linux操作系統(tǒng), 值為nt, 是windows操作系統(tǒng)
print(os.name)
os_name = 'Linux' if os.name =='posix' else 'Windows'
print("當(dāng)前操作系統(tǒng): %s" %(os_name))
#2). 操作系統(tǒng)的詳細(xì)信息
detail_info = os.uname()
print(detail_info)
print("主機(jī)名:", detail_info.nodename)
print("硬件架構(gòu):", detail_info.machine)
print("系統(tǒng)名稱:", detail_info.sysname)
print("Linux內(nèi)核的版本號(hào):", detail_info.release)
#3). 系統(tǒng)環(huán)境變量等價(jià)于Linux的env命令
print(os.environ)
#4). 通過key值獲取環(huán)境變量對(duì)應(yīng)的value值
print(os.environ['PATH'])
"""
import os
from os.path import isabs, abspath, join
#1. 判斷是否為絕對(duì)路徑---'/tmp/hello', 'hello.png', 'qq/hello.mp3'
print(isabs('/tmp/hello'))
print(isabs('hello.py'))
#2. 生成絕對(duì)路徑
#filename = 'hello.py'
filename = '/tmp/hello.py'
if not isabs(filename):
print(abspath(filename))
#3. 'hello.png'
#返回一個(gè)絕對(duì)路徑: 當(dāng)前目錄的絕對(duì)路徑+ 文件名/目錄名
#'/tmp/hello' , 'python.txt' ==== /tmp/hello/python.txt
#C:\tmp\hello\python.txt
print(join('/tmp/hello', 'python.txt'))
#4.獲取目錄名或者文件名
#5. 創(chuàng)建目錄/刪除目錄
#6. 創(chuàng)建文件/刪除文件
#7. 文件重命名(mv)
#8. 判斷文件或者目錄是否存在
#9. 分離后綴名和文件名
#10. 將目錄名和文件名分離"""
"""
import os
BASE_DIR = os.path.abspath(os.path.dirname(file))
print(file) # /home/kiosk/201911python/day07_code/07_目錄常見應(yīng)用.py
print(os.path.dirname(file))
print(os.path.abspath(os.path.dirname(file)))"""
def draw_code_image(str_code='A34G'):
#引入繪圖模塊, Image表示畫布對(duì)象; ImageDraw表示畫筆對(duì)象; ImageFont表示字體對(duì)象;
from PIL import Image, ImageDraw, ImageFont
#定義變量,用于畫面的背景色、寬、高
#RGB:(255,0,0), (0, 255,0), (0, 0, 255)
bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255)
width = 100
height = 25
#創(chuàng)建畫布對(duì)象
im = Image.new('RGB', (width, height), bgcolor)
#創(chuàng)建畫筆對(duì)象
draw = ImageDraw.Draw(im)
#調(diào)用畫筆的point()函數(shù)繪制噪點(diǎn)
for i in range(100):
xy = (random.randrange(0, width), random.randrange(0, height))
fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
draw.point(xy, fill=fill)
#構(gòu)造字體對(duì)象
font = ImageFont.truetype('/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc',
23)
#構(gòu)造字體顏色
fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
for index, item in enumerate(str_code):
#print(5 +index20)) # (5,2) (25, 2), (45,2)
draw.text((5 + (index 20), 2), item, font=font, fill=fontcolor)
return im
"""
import random
def generate_str_code(length=4):
"""隨機(jī)生成驗(yàn)證碼"""
import string
strings = string.ascii_letters + string.digits
return "".join(random.sample(strings, length))
def draw_code_image(str_code):
"""根據(jù)給丁的字符串驗(yàn)證碼繪制驗(yàn)證碼圖片"""
#引入繪圖模塊, Image表示畫布對(duì)象; ImageDraw表示畫筆對(duì)象; ImageFont表示字體對(duì)象;
from PIL import Image, ImageDraw, ImageFont
#定義變量,用于畫面的背景色、寬、高
#RGB:(255,0,0), (0, 255,0), (0, 0, 255)
width = 100
height = 25
white_color = (255, 255, 255)
black_color = (0, 0, 0, 0)
green_color = (0, 255, 0)
#創(chuàng)建畫布對(duì)象
im = Image.new('RGB', (width, height), white_color)
#創(chuàng)建畫筆對(duì)象
draw = ImageDraw.Draw(im)
#調(diào)用畫筆的point()函數(shù)繪制噪點(diǎn)
for i in range(100):
xy = (random.randrange(0, width), random.randrange(0, height))
draw.point(xy, fill=green_color)
#構(gòu)造字體對(duì)象 shell命令: fc-list :lang=zh
font = ImageFont.truetype('doc/wqy-zenhei.ttc', 23)
for index, item in enumerate(str_code):
#print(5 +index20)) # (5,2) (25, 2), (45,2)
draw.text((5 + (index 20), 2), item, font=font, fill=black_color)
return im
if name == 'main':
str_code = generate_str_code()
#返回的圖片對(duì)象
im = draw_code_image(str_code)
im.save('hello.png')"""
Author: lvah
Date: 2019-12-15
Connect: 976131979@qq.com
Description:
項(xiàng)目需求: 批量驗(yàn)證碼圖片生成器
1). 可生成數(shù)字、大寫、小寫字母及三者混合類型的驗(yàn)證碼
2). 支持自定義驗(yàn)證碼字符數(shù)量
3). 支持自動(dòng)調(diào)整驗(yàn)證碼圖片的大小
4). 支持自定義干擾點(diǎn)的數(shù)量
5). 支持自定義驗(yàn)證碼圖文顏色
"""
import os
import random
white_color = (255, 255, 255)
black_color = (0, 0, 0, 0)
green_color = (0, 255, 0)
def generate_str_code(length=4):
"""隨機(jī)生成驗(yàn)證碼"""
import string
strings = string.ascii_letters + string.digits
return "".join(random.sample(strings, length))
def draw_code_image(str_code, item_width=25, height=25, point_count=100,
bg_color=black_color, font_color=white_color):
"""
根據(jù)給定的字符串驗(yàn)證碼繪制驗(yàn)證碼圖片
:param str_code:
:param item_width:
:param height:
:param point_count:
:param bg_color:
:param font_color:
:return:
"""
#引入繪圖模塊, Image表示畫布對(duì)象; ImageDraw表示畫筆對(duì)象; ImageFont表示字體對(duì)象;
from PIL import Image, ImageDraw, ImageFont
#定義變量,用于畫面的背景色、寬、高
#RGB:(255,0,0), (0, 255,0), (0, 0, 255)
#根據(jù)驗(yàn)證碼的長度自動(dòng)調(diào)整畫布的寬度
width = len(str_code) item_width
#創(chuàng)建畫布對(duì)象
im = Image.new('RGB', (width, height), bg_color)
#創(chuàng)建畫筆對(duì)象
draw = ImageDraw.Draw(im)
#調(diào)用畫筆的point()函數(shù)繪制噪點(diǎn)
for i in range(point_count):
xy = (random.randrange(0, width), random.randrange(0, height))
draw.point(xy, fill=green_color)
#構(gòu)造字體對(duì)象 shell命令: fc-list :lang=zh
font = ImageFont.truetype('doc/wqy-zenhei.ttc', 23)
for index, item in enumerate(str_code):
#print(5 +index25)) # (5,2) (25, 2), (45,2)
draw.text((5 + (index * 25), 0), item, font=font, fill=font_color)
return im
if name == 'main':
from tqdm import tqdm
verifyCodeCount = 100
dirname = 'vCode'
for count in tqdm(range(verifyCodeCount)):
#He3x ===== He3x.png
str_code = generate_str_code(length=10)
#返回的圖片對(duì)象
im = draw_code_image(str_code)
#生成圖片文件的絕對(duì)路徑
filename = os.path.join(dirname, str_code + random.choice(['.png', '.jpg']))
im.save(filename)
print("生成圖片驗(yàn)證碼成功")
"""
json模塊詳解:
python 中str類型到JSON中轉(zhuǎn)為unicode類型,None轉(zhuǎn)為null,dict對(duì)應(yīng)object;
pyhton中的集合不能轉(zhuǎn)成json格式
? ensure_ascii=False: 中文存儲(chǔ)需要設(shè)定
? indent=4: 增加縮進(jìn),增強(qiáng)可讀性,但縮進(jìn)空格會(huì)使數(shù)據(jù)變大
? separators=(',',':'): 自定義分隔符,元素間分隔符為逗號(hào), 字典key和value值的分隔符為冒號(hào)
? sort_keys=True: 字典排序
"""
import json
info = dict(user1='00000', user2='11111', 粉條='1111')
#編碼: 字典轉(zhuǎn)成json數(shù)據(jù)格式
json_info = json.dumps(info)
print(info, json_info)
print(type(info), type(json_info))
#編碼: 字典轉(zhuǎn)成json并存儲(chǔ)未文件
json.dump(info, open('doc/info.json', 'w'), indent=4, ensure_ascii=False)
print("寫入json文件成功")
"""
"""
import json
filename = 'doc/info.json'
#解碼: 將文件中的json數(shù)據(jù)轉(zhuǎn)換成python對(duì)象及型處理
python_info = json.load(open(filename))
print(python_info)
print(python_info.get('粉條'))
"""
我們碰到集合對(duì)象, datetime對(duì)象,或者自定義的類對(duì)象等json默認(rèn)不支持的數(shù)據(jù)類型時(shí),我們就需
要自定義編解碼函數(shù)。有兩種方法來實(shí)現(xiàn)自定義編解碼。
"""
from datetime import datetime
from datetime import date
import json
def time2str(dateObj):
return str(dateObj)
dt = datetime.now()
today = date.today()
#自定義編碼和解碼
with open('doc/date.json', 'w') as f:
#Object of type date is not JSON serializable
json.dump(today, f, default=time2str)
print('dump ok')"""
python的pickle模塊實(shí)現(xiàn)了python的所有數(shù)據(jù)序列和反序列化。與JSON不同的是pickle不是用于多種
語言間的數(shù)據(jù)傳輸,它僅作為python對(duì)象的持久化或者python程序間進(jìn)行互相傳輸對(duì)象的方法,因此
它支持了python所有的數(shù)據(jù)類型。cPickle是pickle模塊的C語言編譯版本相對(duì)速度更快。
總結(jié):
1、JSON只能處理基本數(shù)據(jù)類型。pickle能處理所有Python的數(shù)據(jù)類型。
2、JSON用于各種語言之間的字符轉(zhuǎn)換。pickle用于Python程序?qū)ο蟮某志没蛘逷ython程序間對(duì)象
網(wǎng)絡(luò)傳輸,但不同版本的Python序列化可能還有差異。
import pickle
#編碼
from datetime import date
today = date.today()
with open('date.pkl', 'wb') as f:
pickle.dump(today, f)
print('pickle dump ok')
#解碼: 反序列化
with open('date.pkl', 'rb') as f:
today = pickle.load(f)
print('pickle load ok')
print(today)
"""
"""
filename = 'doc/passwd.bak'
with open(filename) as f:
for line in f:
if not line.startswith('#'):
print(line)"""
異常處理機(jī)制
Python 的異常機(jī)制主要依賴 try 、except 、else、finally 和 raise 五個(gè)關(guān)鍵字。
? try 關(guān)鍵字后縮進(jìn)的代碼塊簡稱 try 塊,它里面放置的是可能引發(fā)異常的代碼;
? except 關(guān)鍵字對(duì)應(yīng)異常類型和處理該異常的代碼塊;
? 多個(gè) except 塊之后可以放一個(gè) else 塊,表明程序不出現(xiàn)異常時(shí)還要執(zhí)行 else 塊;
? finally 塊用于回收在 try 塊里打開的物理資源,異常機(jī)制會(huì)保證 finally 塊總被執(zhí)行;
? raise 用于引發(fā)一個(gè)實(shí)際的異常,raise 可以單獨(dú)作為語句使用,引發(fā)一個(gè)具體的異常對(duì)象;
除了處理實(shí)際的錯(cuò)誤條件之外,對(duì)于異常還有許多其它的用處。在標(biāo)準(zhǔn) Python 庫中
一個(gè)普通的用法就是試著導(dǎo)入一個(gè)模塊,然后檢查是否它能使用。導(dǎo)入一個(gè)并不存在的
模塊將引發(fā)一個(gè) ImportError 異常。
你可以使用這種方法來定義多級(jí)別的功能――依靠在運(yùn)行時(shí)哪個(gè)模塊是有效的,或支
觸發(fā)異常
持多種平臺(tái) (即平臺(tái)特定代碼被分離到不同的模塊中)。
Python 允許程序自行引發(fā)異常,自行引發(fā)異常使用 raise 語句來完成。
raise語句中 Exception 是異常的類型(例如,NameError)參數(shù)標(biāo)準(zhǔn)異常中任一種,
args 是自已提供的異常參數(shù)。
raise [Exception [, args [, traceback]]]
自定義異常
用戶自定義異常都應(yīng)該繼承 Exception 基類或 Exception 的子類,在自定義異常類時(shí)基
本不需要書寫更多的代碼,只要指定自定義異常類的父類即可
? 不要過度使用異常
? 不要使用過于龐大的 try 塊
? 不要忽略捕獲到的異常
import os
dirname = 'dir'
filename = os.path.join(dirname, 'hello.html') # dir/hello.html
#try 關(guān)鍵字后縮進(jìn)的代碼塊簡稱 try 塊,它里面放置的是可能引發(fā)異常的代碼;
try:
with open(filename, 'w') as f:
f.write('hello')
#except 關(guān)鍵字對(duì)應(yīng)異常類型和處理該異常的代碼塊;
except FileNotFoundError as e:
os.mkdir(dirname)
#如何沒有產(chǎn)生任何異常時(shí), 執(zhí)行的內(nèi)容
else:
print('no exception')
#finally 塊用于回收在 try 塊里打開的物理資源,異常機(jī)制會(huì)保證 finally 塊總被執(zhí)行
finally:
print("不管是否有異常都要執(zhí)行的代碼")
"""
"""
try:
print(10/0) # ZeroDivisionError, 異常處理之后, try里面的代碼并不會(huì)繼續(xù)執(zhí)行。
print(a) # NameError
except ZeroDivisionError as e:
print('zero')
except NameError as e:
print('name')
else:
print('ok')
print('step 1')"""
#IndexError
#NameError
class AgeError(ValueError):
pass
age = 1000
if 0 < age < 150:
print('age legal')
else:
raise AgeError('age error')
1 批量改名:
import os
path = 'doc/'
for i in os.listdir(path):
new_name = '[西部開源]-' + i
os.rename(os.path.join(path,i),os.path.join(path,new_name))
print(new_name)
2 忽略注釋行:
filename = 'doc/passwd.bak'
with open(filename) as f:
for line in f:
if not line.startswith("#"):
print(line)
3 密碼簿:
import os
f = open('doc/book.txt','a+')
def main():
print("密碼簿管理系統(tǒng)")
print("1.增加網(wǎng)址和密碼")
print("2.刪除網(wǎng)址和密碼")
print("3.修改網(wǎng)址和密碼")
print("4.查詢網(wǎng)址和密碼")
print("5.退出系統(tǒng)")
def add_book():
f = open("doc/book.txt",'a+')
web = input("輸入網(wǎng)址:")
passwd = input("輸入密碼:")
f.write("網(wǎng)址名:"+web+"\t"+"密碼:"+passwd+"\n")
print("寫入成功")
f.close()
def del_book():
f = open("doc/book.txt", 'a+')
web = input("輸入要?jiǎng)h除的網(wǎng)址:")
f.seek(0,0) # 重新設(shè)置位置到文件開頭
a = f.readlines()
temp_file = open("doc/tmp.txt",'w')
i = 0
for temp in a:
b = temp.split("\t")
net_name = b[0].split(":")
if web == net_name[1]:
print("刪除成功!")
i = 1
continue
else:
temp_file.write(temp)
if i == 0:
print("沒有找到要?jiǎng)h除的網(wǎng)址!!")
temp_file.close()
f.close()
os.remove("doc/book.txt")
os.rename("doc/tmp.txt", "doc/book.txt")
def change_book():
f = open("doc/book.txt", "a+")
f.seek(0, 0) # 重新設(shè)置位置到文件開頭
re_net = input("請(qǐng)輸入要修改的網(wǎng)址名:")
a = f.readlines()
temp_file = open("doc/tmp.txt", "w+")
i = 0
for temp in a:
b = temp.split("\t")
net_name = b[0].split(":")
if re_net == net_name[1]:
print("要修改的網(wǎng)址已找到??!")
web = input("請(qǐng)輸入新的網(wǎng)址名")
passwd = input("請(qǐng)輸入新的密碼")
temp_file.write("網(wǎng)址名:" + web + "\t" + "密碼:" + passwd + "\n")
print("修改成功??!")
i = 1
continue
else:
temp_file.write(temp)
if i == 0:
print("沒有找到要修改的網(wǎng)址!!")
temp_file.close()
f.close()
os.remove("doc/book.txt")
os.rename("doc/tmp.txt", "doc/book.txt")
def find_book():
f = open("doc/book.txt")
f.seek(0, 0) # 重新設(shè)置位置到文件開頭
goal = input("請(qǐng)輸入要查詢的網(wǎng)址名:")
content = f.readlines()
i = 0
length = len(content)
for temp in content:
i += 1
b = temp.split("\t")
net_name = b[0].split(":")
if goal == net_name[1]:
print(temp, end="")
i = 1
elif i == length and goal != net_name:
print("沒有找到。。")
break
f.close()
main()
while True:
num = input("請(qǐng)輸入序號(hào):\n")
num = int(num)
if num == 1:
add_book()
elif num == 2:
del_book()
elif num == 3:
change_book()
elif num == 4:
find_book()
elif num == 5:
f.close()
exit()
else:
print("請(qǐng)輸入正確序號(hào)")
continue
main()
學(xué)生管理系統(tǒng)(文件版)
import re # 導(dǎo)入正則表達(dá)式模塊
import os # 導(dǎo)入操作系統(tǒng)模塊
filename = "students.txt" # 定義保存學(xué)生信息的文件名
def menu():
# 輸出菜單
print('''
學(xué)生信息管理系統(tǒng)
=============== 功能菜單 ===============
│ 1 錄入學(xué)生信息 │
│ 2 查找學(xué)生信息 │
│ 3 刪除學(xué)生信息 │
│ 4 修改學(xué)生信息 │
│ 5 排序 │
│ 6 統(tǒng)計(jì)學(xué)生總?cè)藬?shù) │
│ 7 顯示所有學(xué)生信息 │
│ 0 退出系統(tǒng)
''')
def main():
ctrl = True # 標(biāo)記是否退出系統(tǒng)
while (ctrl):
menu() # 顯示菜單
option = input("請(qǐng)選擇:") # 選擇菜單項(xiàng)
option_str = re.sub("\D", "", option) # 提取數(shù)字
if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
option_int = int(option_str)
if option_int == 0: # 退出系統(tǒng)
print('您已退出學(xué)生成績管理系統(tǒng)!')
ctrl = False
elif option_int == 1: # 錄入學(xué)生成績信息
insert()
elif option_int == 2: # 查找學(xué)生成績信息
search()
elif option_int == 3: # 刪除學(xué)生成績信息
delete()
elif option_int == 4: # 修改學(xué)生成績信息
modify()
elif option_int == 5: # 排序
sort()
elif option_int == 6: # 統(tǒng)計(jì)學(xué)生總數(shù)
total()
elif option_int == 7: # 顯示所有學(xué)生信息
show()
'''1 錄入學(xué)生信息'''
def insert():
stdentList = [] # 保存學(xué)生信息的列表
mark = True # 是否繼續(xù)添加
while mark:
id = input("請(qǐng)輸入ID(如 1001):")
if not id: # ID為空,跳出循環(huán)
break
name = input("請(qǐng)輸入名字:")
if not name: # 名字為空,跳出循環(huán)
break
try:
english = int(input("請(qǐng)輸入英語成績:"))
python = int(input("請(qǐng)輸入Python成績:"))
c = int(input("請(qǐng)輸入C語言成績:"))
except:
print("輸入無效,不是整型數(shù)值....重新錄入信息")
continue
stdent = {"id": id, "name": name, "english": english, "python": python, "c": c} # 將輸入的學(xué)生信息保存到字典
stdentList.append(stdent) # 將學(xué)生字典添加到列表中
inputMark = input("是否繼續(xù)添加?(y/n):")
if inputMark == "y": # 繼續(xù)添加
mark = True
else: # 不繼續(xù)添加
mark = False
save(stdentList) # 將學(xué)生信息保存到文件
print("學(xué)生信息錄入完畢!??!")
#將學(xué)生信息保存到文件
def save(student):
try:
students_txt = open(filename, "a") # 以追加模式打開
except Exception as e:
students_txt = open(filename, "w") # 文件不存在,創(chuàng)建文件并打開
for info in student:
students_txt.write(str(info) + "\n") # 按行存儲(chǔ),添加換行符
students_txt.close() # 關(guān)閉文件
'''2 查找學(xué)生成績信息'''
def search():
mark = True
student_query = [] # 保存查詢結(jié)果的學(xué)生列表
while mark:
id = ""
name = ""
if os.path.exists(filename): # 判斷文件是否存在
mode = input("按ID查輸入1;按姓名查輸入2:")
if mode == "1":
id = input("請(qǐng)輸入學(xué)生ID:")
elif mode == "2":
name = input("請(qǐng)輸入學(xué)生姓名:")
else:
print("您的輸入有誤,請(qǐng)重新輸入!")
search() # 重新查詢
with open(filename, 'r') as file: # 打開文件
student = file.readlines() # 讀取全部內(nèi)容
for list in student:
d = dict(eval(list)) # 字符串轉(zhuǎn)字典
if id is not "": # 判斷是否按ID查
if d['id'] == id:
student_query.append(d) # 將找到的學(xué)生信息保存到列表中
elif name is not "": # 判斷是否按姓名查
if d['name'] == name:
student_query.append(d) # 將找到的學(xué)生信息保存到列表中
show_student(student_query) # 顯示查詢結(jié)果
student_query.clear() # 清空列表
inputMark = input("是否繼續(xù)查詢?(y/n):")
if inputMark == "y":
mark = True
else:
mark = False
else:
print("暫未保存數(shù)據(jù)信息...")
return
'''3 刪除學(xué)生成績信息'''
def delete():
mark = True # 標(biāo)記是否循環(huán)
while mark:
studentId = input("請(qǐng)輸入要?jiǎng)h除的學(xué)生ID:")
if studentId is not "": # 判斷要?jiǎng)h除的學(xué)生是否存在
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內(nèi)容
else:
student_old = []
ifdel = False # 標(biāo)記是否刪除
if student_old: # 如果存在學(xué)生信息
with open(filename, 'w') as wfile: # 以寫方式打開文件
d = {} # 定義空字典
for list in student_old:
d = dict(eval(list)) # 字符串轉(zhuǎn)字典
if d['id'] != studentId:
wfile.write(str(d) + "\n") # 將一條學(xué)生信息寫入文件
else:
ifdel = True # 標(biāo)記已經(jīng)刪除
if ifdel:
print("ID為 %s 的學(xué)生信息已經(jīng)被刪除..." % studentId)
else:
print("沒有找到ID為 %s 的學(xué)生信息..." % studentId)
else: # 不存在學(xué)生信息
print("無學(xué)生信息...")
break # 退出循環(huán)
show() # 顯示全部學(xué)生信息
inputMark = input("是否繼續(xù)刪除?(y/n):")
if inputMark == "y":
mark = True # 繼續(xù)刪除
else:
mark = False # 退出刪除學(xué)生信息功能
'''4 修改學(xué)生成績信息'''
def modify():
show() # 顯示全部學(xué)生信息
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內(nèi)容
else:
return
studentid = input("請(qǐng)輸入要修改的學(xué)生ID:")
with open(filename, "w") as wfile: # 以寫模式打開文件
for student in student_old:
d = dict(eval(student)) # 字符串轉(zhuǎn)字典
if d["id"] == studentid: # 是否為要修改的學(xué)生
print("找到了這名學(xué)生,可以修改他的信息!")
while True: # 輸入要修改的信息
try:
d["name"] = input("請(qǐng)輸入姓名:")
d["english"] = int(input("請(qǐng)輸入英語成績:"))
d["python"] = int(input("請(qǐng)輸入Python成績:"))
d["c"] = int(input("請(qǐng)輸入C語言成績:"))
except:
print("您的輸入有誤,請(qǐng)重新輸入。")
else:
break # 跳出循環(huán)
student = str(d) # 將字典轉(zhuǎn)換為字符串
wfile.write(student + "\n") # 將修改的信息寫入到文件
print("修改成功!")
else:
wfile.write(student) # 將未修改的信息寫入到文件
mark = input("是否繼續(xù)修改其他學(xué)生信息?(y/n):")
if mark == "y":
modify() # 重新執(zhí)行修改操作
'''5 排序'''
def sort():
show() # 顯示全部學(xué)生信息
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as file: # 打開文件
student_old = file.readlines() # 讀取全部內(nèi)容
student_new = []
for list in student_old:
d = dict(eval(list)) # 字符串轉(zhuǎn)字典
student_new.append(d) # 將轉(zhuǎn)換后的字典添加到列表中
else:
return
ascORdesc = input("請(qǐng)選擇(0升序;1降序):")
if ascORdesc == "0": # 按升序排序
ascORdescBool = False # 標(biāo)記變量,為False表示升序排序
elif ascORdesc == "1": # 按降序排序
ascORdescBool = True # 標(biāo)記變量,為True表示降序排序
else:
print("您的輸入有誤,請(qǐng)重新輸入!")
sort()
mode = input("請(qǐng)選擇排序方式(1按英語成績排序;2按Python成績排序;3按C語言成績排序;0按總成績排序):")
if mode == "1": # 按英語成績排序
student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)
elif mode == "2": # 按Python成績排序
student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
elif mode == "3": # 按C語言成績排序
student_new.sort(key=lambda x: x["c"], reverse=ascORdescBool)
elif mode == "0": # 按總成績排序
student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse=ascORdescBool)
else:
print("您的輸入有誤,請(qǐng)重新輸入!")
sort()
show_student(student_new) # 顯示排序結(jié)果
''' 6 統(tǒng)計(jì)學(xué)生總數(shù)'''
def total():
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內(nèi)容
if student_old:
print("一共有 %d 名學(xué)生!" % len(student_old))
else:
print("還沒有錄入學(xué)生信息!")
else:
print("暫未保存數(shù)據(jù)信息...")
''' 7 顯示所有學(xué)生信息 '''
def show():
student_new = []
if os.path.exists(filename): # 判斷文件是否存在
with open(filename, 'r') as rfile: # 打開文件
student_old = rfile.readlines() # 讀取全部內(nèi)容
for list in student_old:
student_new.append(eval(list)) # 將找到的學(xué)生信息保存到列表中
if student_new:
show_student(student_new)
else:
print("暫未保存數(shù)據(jù)信息...")
#將保存在列表中的學(xué)生信息顯示出來
def show_student(studentList):
from prettytable import PrettyTable
if not studentList:
print("(o@.@o) 無數(shù)據(jù)信息 (o@.@o) \n")
return
field_names = ("ID", "名字", "英語成績", "Python成績", "C語言成績", "總成績")
table = PrettyTable(field_names=field_names)
for info in studentList:
sum_score = info.get('english', 0) + info.get('python', 0) + info.get('c', 0)
row = list(info.values())
row.append(sum_score)
table.add_row(row)
print(table)
if __name__ == "__main__":
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。