小甲魚Python筆記(下)


二十八 二十九  文件

打開文件 open(文件名[,模式][,緩沖])  注意open是個函數不是方法

模式:

緩沖:

大於1的數字代表緩沖區的大小(單位是字節),-1(或者是任何負數)代表使用默認緩沖區大小

只有用flush或者close時才會更新硬盤的數據

 

三種標准的流:

輸入:sys.stdin 輸出:sys.stdout  錯誤:sys.stderr

用list()讓文件成為一個列表,每一行是一個元素

用f.seek(0,0)還原文件指針到起始位置

用for讀取文件中的每一行

 

三十  os模塊和os.path模塊

Python os模塊包含普遍的操作系統功能,注意括號中需要使用字符串

1.getcwd()

返回當前工作目錄

2.chdir(path)

改變工作目錄

3.listdir(path='.')

列舉指定目錄中的文件名('.'表示當前目錄,'..'表示上一級目錄)

4.mkdir(path)

創建單層目錄,如該目錄已存在拋出異常

5.makedirs(path)

遞歸創建多層目錄,如該目錄已存在拋出異常,注意:'E:\\a\\b'和'E:\\a\\c'並不會沖突

6.remove(path)

刪除文件

7.rmdir(path)

刪除單層目錄,如該目錄非空則拋出異常

8.removedirs(path)

遞歸刪除目錄,從子目錄到父目錄逐層嘗試刪除,遇到目錄非空則拋出異常

9.rename(old, new)

將文件old重命名為new

10.system(command)

運行系統的shell命令

 

以下函數沒有參數

11.os.curdir

指代當前目錄('.')

12.os.pardir

指代上一級目錄('..')

13.os.sep

輸出操作系統特定的路徑分隔符(Win下為'\\',Linux下為'/')

14.os.linesep

當前平台使用的行終止符(Win下為'\r\n',Linux下為'\n')

15.os.name

指代當前使用的操作系統(包括:'posix', 'nt', 'mac', 'os2', 'ce', 'java')

 

os.path模塊

1.basename(path)

去掉目錄路徑,單獨返回文件名

2.dirname(path)

去掉文件名,單獨返回目錄路徑

3.join(path1[, path2[, ...]])

將path1, path2各部分組合成一個路徑名

4,split(path)

分割文件名與路徑,返回(f_path, f_name)元組。如果完全使用目錄,它也會將最后一個目錄作為文件名分離,且不會判斷文件或者目錄是否存在

5.splitext(path)

分離文件名與擴展名,返回(f_name, f_extension)元組

6.getsize(file)

返回指定文件的尺寸,單位是字節

7.getatime(file)

返回指定文件最近的訪問時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)

8.getctime(file)

返回指定文件的創建時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)

9.getmtime(file)

返回指定文件最新的修改時間(浮點型秒數,可用time模塊的gmtime()或localtime()函數換算)

 

以下為函數返回 True 或 False

10.exists(path)

判斷指定路徑(目錄或文件)是否存在

11.isabs(path)

判斷指定路徑是否為絕對路徑

12.isdir(path)

判斷指定路徑是否存在且是一個目錄

13.isfile(path)

判斷指定路徑是否存在且是一個文件

14.islink(path)

判斷指定路徑是否存在且是一個符號鏈接

15.ismount(path)

判斷指定路徑是否存在且是一個掛載點

16.samefile(path1, paht2)

判斷path1和path2兩個路徑是否指向同一個文件

 

三十一  pickle模塊

以二進制保存數據

三步走:打開文件,用pickle.dump()方法將數據放入文件,關閉文件

1 import pickle
2 my_list = [1,2,'老王',['abc']]
3 pickle_file = open('my_list.pkl','wb') #文件名后綴無所謂
4 pickle.dump(my_list,pickle_file)
5 pickle_file.close()

 

這樣文件夾中就保存了my_list.pkl文件,(查詢當前目錄是用 import os   os.getcwd())

讀取數據

打開文件,調用pickle.load()方法

pickle_file = open('my_list.pkl','rb')
list2 = pickle.load(pickle_file)
print(list2)

 

三十二 三十三  異常

常見異常類型:

AttributeError:屬性錯誤,特性引用和賦值失敗時會引發屬性錯誤
NameError:試圖訪問的變量名不存在
SyntaxError:語法錯誤,代碼形式錯誤
Exception:所有異常的基類,因為所有python異常類都是基類Exception的其中一員,異常都是從基類Exception繼承的,並且都在exceptions模塊中定義。
IOError:一般常見於打開不存在文件時會引發IOError錯誤,也可以解理為輸出輸入錯誤
KeyError:使用了映射中不存在的關鍵字(鍵)時引發的關鍵字錯誤
IndexError:索引錯誤,使用的索引不存在,常索引超出序列范圍,什么是索引
TypeError:類型錯誤,內建操作或是函數應於在了錯誤類型的對象時會引發類型錯誤
ZeroDivisonError:除數為0,在用除法操作時,第二個參數為0時引發了該錯誤
ValueError:值錯誤,傳給對象的參數類型不正確,像是給int()函數傳入了字符串數據類型的參數。

 

捕獲異常

try語句一旦被檢測出異常,剩下的語句將不會被執行

幾種搭配:

1.try except

1 try:
2     sum = 1/0
3 except ZeroDivisionError:
4     print('出錯')

 

可以指明出錯原因:

1 try:
2     sum = 1/0
3 except ZeroDivisionError as reason:
4     print('出錯,錯誤原因:',str(reason))

 

可以用多個except語句:

1 try:
2     f = open("nofile.txt")
3     sum = 1/0
4 except IOError as reason:
5     print('出錯,錯誤原因:',str(reason))
6 except ZeroDivisionError as reason:
7     print('出錯,錯誤原因:',str(reason))

 

可以用一個元組捕獲多個異常:

1 try:
2     sum = 1/0
3     f = open("nofile.txt") 
4 except (IOError,ZeroDivisionError) as reason:
5     print('出錯,錯誤原因:',str(reason))

 

用while True 和 else 組合,else后的語句在沒有異常的情況下才執行,注意縮進,輸入錯誤后會重新輸入直到正確:

 1 while True:
 2     try:
 3         x = int(input("input first num"))
 4         y = int(input("input first num"))
 5         z = x/y
 6         print(z)
 7     except ZeroDivisionError:
 8         print("error,try again")
 9     else:
10         break

 

不管try語句中是否發生異常,finally語句后都會執行:

1 try:
2     x = int(input("input first num"))
3     y = int(input("input first num"))
4     z = x/y
5     print(z)
6 except ZeroDivisionError:
7     print("error:")
8 finally:
9     print("結束")

 

三十四  else和with

else:

if-else語句:

和各種語言相同的用法,在條件語句中,與if語句搭配使用的else語句。如果if語句的條件表達式的結果布爾值為假,那么程序將執行else語句后的代碼。

elif(else-if)語句:

elif是python提供的else-if語句,它檢查多個條件表達式的值是否為真,並在為真時執行特定代碼塊中的代碼。和else一樣,elif是可選的,但是要注意的是,一個if語句可以跟多個elif語句,但最后只能有一個else語句

while-else/for-else語句:

在其他語言中,除了條件語句,是不會見到else分支的,但在Python中,while和for循環中,也是可以使用else語句的。它們的工作順序為:在循環中使用時,else語句只在循環完成后執行,也就是說,break語句也會跳過else代碼塊,只要循環是正常結束,而不是通過break,else語句就會執行

求素數:

 1 def fun(num):
 2     count = int(num/2)
 3     while count>1:
 4         if(num%count == 0):
 5             print("%d的最大公約數是:%d" %(num,count))
 6             break
 7         count -= 1
 8     else:
 9         print("%d是素數" %num)
10 
11 n = int(input("請輸入一個整數:"))
12 fun(n)

 

執行結果:

注意:Python中沒有自增自減運算符,格式化輸出多個字符要用元組的形式

try-else語句:

對於python中的錯誤和異常,try-except語句段,也可以和else連用,其功能和循環中的else語句沒有多大區別:在try范圍內沒有檢測到異常的時候,執行else子句。

 

with:

這個語法是用來代替傳統的try...finally語法的。

with EXPRESSION [ as VARIABLE] WITH-BLOCK

1 try:
2     with open("e://1.txt",'r') as f:
3         for each_line in f:
4             print(each_line)
5 except IOError as reason:
6     print("Error:",str(reason))

 如果用finally,若是文件不存在,也要走f.close(),這樣的話文件存在打開后會自動關閉

 

模塊

(1)import 文件名  比如想導入tmp.py,在主程序中寫import tmp,並用tmp.調用函數

(2)from 模塊 import 函數(若要引用全部,寫*)  在主程序中直接調用函數名

(3)import 文件名 as 別名  在主程序中用 別名. 調用函數

 

if __name__ == "__main__":

簡單來說當一個文件作為模塊時,在if __name__ == "__main__":語句后的內容不能被調用

原理:

當作為模塊時,可見__name__並不等於__main__,所以之后的東西不會執行,也不能被調用

 

搜索路徑:用列表的方式添加或刪除

 

包:創建一個文件夾,文件夾中存放相應模塊,文件夾的名字就是包的名字,在文件夾中創建一個__init__.py的模塊文件,內容可以為空

使用包,import 包名.模塊名

 

標准庫

學習一個模塊的方法,以timeit模塊為例:

1.IDLE中F1,索引

2. IDLE中print(timeit.__doc__)查詢模塊說明

3. dir(timeit)查詢所有用法

4. timeit.__all__查詢對外接口

5. timeit.__file__查詢源碼路徑

 

介紹timeit模塊

 

爬蟲

urllib


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM