7.python的基礎語法元素_文件、異常和模塊

#-*- coding: utf-8 -*-

print("==============文件的讀寫=============")
#文件的讀寫
#文件打開  文件打開的通用格式  使用with塊的好處是:執行完畢後,自動對文件進行close操作
#with open("文件路徑","打開模式",encoding="操作文件的字符編碼") as f:
#    """對文件進行相應的讀寫操作"""

#一個簡單的文件讀取
with open(r"C:\Projectsrc\Pythonsrc\python-tutorial\python基礎語法\test.txt","r",encoding="utf-8") as f:  #第一步 打開文件
    text = f.read()                                                                                       #第二步 讀取文件
    print(text)

#程序與文件在同一文件夾,文件路徑可簡化爲文件名
with open(r"test.txt","r",encoding="utf-8") as f:  #第一步 打開文件
    text = f.read()                                #第二步 讀取文件
    print(text)

#打開模式
#"r" 只讀模式 如果文件不存在 報錯
#"w" 覆蓋寫模式 如文件不存在 則創建;如文件存在,則完全覆蓋原文件
#"x" 創建寫模式 如文件不存在 則創建;如文件存在 報錯
#"a" 追加寫模式,如文件不存在,則創建;如文件存在,則在原文件後追加內容
#"b" 二進制文件模式,不能單獨使用,需要配合使用如"rb","wb","ab",該模式不需要指定encoding
#"t" 文本文件模式,默認值 需配合使用,如 "rt","wt","at",一般省略,簡寫成 "r","w","a"
#"+", 與"r","w","x","a"配合使用,在原功能的基礎上,增加讀寫功能
#打開模式缺省 默認爲只讀模式


#字符編碼
#萬國碼  utf-8  包含全世界所有國家需要用到的字符
#中文編碼 gbk 專門解決中文編碼問題 windows系統下,如果缺省,則默認爲gbk(所在區域的編碼)
#爲清楚起見 除了處理二進制文件 建議不要缺省 encoding


#文件讀取
#逐行進行讀取   f.readline
with open(r"test.txt","r",encoding="utf-8") as f:
    text = f.readline()
    print(text)

#讀入所有行,以每行爲元素形成一個列表 -- f.readlines()
with open(r"test.txt","r",encoding="utf-8") as f:
    text = f.readlines()
    print(text)  #注意每行末尾有換行符

with open(r"test.txt", "r", encoding="utf-8") as f:
        for text in f.readlines(): #遍歷列表
          print(text)

#當文件內容過大時,read和readlines佔用內存過大,不建議使用,readline用起來不太方便,此時可以直接遍歷f
with open(r"test.txt", "r", encoding="utf-8") as f:
    for text in f:                  #f本身就是一個可迭代對象,每次迭代都讀取一行內容
        print("直接遍歷f:",text)

#圖片:二進制文件
with open("test.jpg","rb") as f:
    print(len(f.readlines()))

#文件的寫入
#向文件寫入一個字符串或字節流(二進制)-- f.write
with open("test.txt","w",encoding="utf-8") as f:
    f.write("你曾經對我說\n")     #文件不存在則創建一個,如果文件存在,新寫入的內容會覆蓋掉原內容,一定要注意
    f.write("你永遠愛着我\n")     #如需要換行,末尾添加換行符 \n
#追加寫入
with open("test.txt","a",encoding="utf-8") as f:
    f.write("你曾經對我說\n")    #追加模式
#將一個元素爲字符串的列表整體寫入文件 -- f.writelines()
ls = ["春天颳着風\n","秋天下着雨\n","春風秋雨多少海誓山盟隨風遠去\n"]
with open("test.txt","w",encoding="utf-8") as f:
    f.writelines(ls)

#既讀又寫
#"r+" 如果文件名不存在 則報錯,指針在開始,如果要進行寫操作,要把指針移動到末尾才能開始寫,否則會覆蓋前面內容
with open("test1.txt","r+",encoding="utf-8") as f:
#    for line in f:
#        print(line) 全部讀一遍後,指針達到結尾
     f.seek(0,2)   #或者可以將指針移動到末尾  f.seek(偏移字節數,位置(0:開始, 1:當前位置, 2:結尾))
     text = ["蕭瑟秋風今又是,\n","換了人間。\n"] #將這兩句追加到結尾
     f.writelines(text)

#w+ 若文件不存在,則創建 若文件存在,會立即清空原內容
with open("test1.txt","w+",encoding="utf-8") as f:
    text = ["蕭瑟秋風今又是,\n","換了人間。\n"]  #清空原內容
    f.writelines(text)   #寫入新內容,指針在最後
    f.seek(0,0)  #指針移動到開始
    print(f.read())

#a+ 若文件不存在,則創建,指針在末尾 添加新內容,不會清空原內容
with open("test1.txt","a+",encoding="utf-8") as f:
    text = ["蕭瑟秋風今又是,\n","換了人間。\n"]
    f.writelines(text)   #指針在最後,追加新內容
    f.seek(0,0)  #指針移動到開始
    print(f.read())

print("==================數據存儲與讀取==================")
#本節簡單瞭解兩種數據存儲結構,csv和json
#csv格式 由逗號將數據分開的字符序列,可以由excel打開
#讀取
with open("成績.csv","r",encoding="utf-8") as f:
    ls = []
    for line in f:      #逐行讀取
        ls.append(line.strip("\n").split(",")) #去掉每行的換行符,然後用","進行分割

for res in ls:
    print (res)
#寫入
ls = [['編號','數學成績','語文成績'],['1','100','90'],['2','96','99']]
with open("score.csv","w",encoding="utf-8") as f:
    for row in ls:
        f.write(",".join(row)+"\n") #用逗號組成字符串形式,末尾加換行符

#json格式 常被用來存儲字典類型
#寫入 --dump()
import json
scores = {"Peter":{"math":96,"physics":98},"Paul":{"math":96,"physics":98}}
with open("score.json","w",encoding="utf-8") as f:   #寫入整個對象
    json.dump(scores,f,indent=4,ensure_ascii=False)  #indent 表示字符換行+縮進

#讀取  --load
with open("score.json","r",encoding="utf-8") as f:
    scores = json.load(f)
    for k,v in scores.items():
        print(k,v)

print("================異常處理================")
#常見異常的產生
#除0運算;找不到可讀文件 FileNotFoundError;值錯誤 ValueError 傳入一個不期望的值,即使這個值的類型是正確的;索引錯誤-IndexError,下標超出序列邊界;類型錯誤 -typeError,傳入對象類型與要求不符
#當異常發生時,如不預先設定處理方法,程序就會中斷,異常的處理  可提高程序的穩定性與可靠性
# try_except  如果try內代碼塊順利執行,except不被觸發,如果try內代碼塊發生錯誤,觸發except執行except內代碼塊
#單分支
x =10
y = 0
try:
    z = x/y
except ZeroDivisionError:    #一般來說會預測到出現什麼錯誤
    print("0不可以被除!")

#多分支
ls = []
d = {"name":"andy"}
try:
    d["age"]
except NameError:
    print("變量名不存在")
except IndexError:
    print("索引超出界限")
except KeyError:
    print("鍵不存在")

#萬能的Exception 所有錯誤的老祖宗 可以捕捉任何錯誤類型
ls = []
d = {"name":"andy"}
try:
    print (d["age"])
except Exception:
    print("出錯啦")

#用as捕捉異常錯誤的值
ls = []
d = {"name":"andy"}
try:
    y = m
except Exception as e: #雖然不能獲得錯誤的具體類型,但是可以獲得錯誤的值
    print("錯誤值:",e)

#try_except_else 如果try模塊執行,則else模塊也執行,可以將else模塊看做是try成功的額外獎賞,如果try內容報錯,則else就不會執行
try:
    with open("test1.txt","r",encoding="utf-8") as f:
        text = f.read()
except FileNotFoundError:
    print("找不到該文件")
else:
    print("文件內容:\n",text)

#try_except_finally
#無論try模塊是否執行,finally最後都執行
ls = []
d = {"name":"andy"}
try:
    y = x
    print (ls[3])
    print (d["age"])
except Exception as e:
    print (e)
finally:
    print("不論觸不觸發異常,都將執行")


print("==============模塊===============")
#模塊分類
#python內置模塊 時間庫time 隨機庫random 容器數據類型collection 迭代數據類型 itertools
#第三方庫 數據分析numpy pandas 數據可視化 matplotlib 機器學習 scikit-learn 深度學習 tensorflow
#自定義文件 單獨的py文件; 包--文件夾內有多個py文件,再加上一個__init__.py文件(內容可以爲空)
#模塊的導入
#導入整個模塊:  import 模塊名
#調用方式: 模塊名.函數名或類名
import time
start = time.time()
time.sleep(3)
end = time.time()
print("程序運行用時:{:.2f}秒".format(end-start))
#從模塊中導入類或函數 - from 模塊 import 類名或函數名
#調用方式:函數名或類名
from itertools import product
ls = list(product("AB","123"))
print (ls)
#一次導入多個 from function import fun1,fun2
#導入模塊中所有的類和函數  from 模塊 import *
#調用方式:函數名或類名
from random import *
print(randint(1,100))
print(random())
#模塊的搜索查找路徑
#首先搜索內存中已經加載的模塊,其次導入內置模塊,最後導入sys.path路徑中包含的模塊
# sys.path的第一個路徑是當前執行文件所在的文件夾,若所需模塊不在其中,則需要將模塊的路徑添加到sys.path
#import sys
#sys.path.append("C:\\xxx\\xxx\\xxx") #注意是雙斜槓

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章