標籤:Python 檔案操作和字元編碼
1、檔案操作1、檔案操作流程:
開啟檔案,得到檔案控制代碼並賦值給一個變數===> file = open("yesterday",encoding="utf-8")通過控制代碼對檔案進行操作關閉檔案 ==> file.close()
1.2、開啟檔案的模式
r,唯讀模式(預設)。w,唯寫模式。【不可讀;不存在則建立;存在則刪除內容;】a,追加模式。【可讀; 不存在則建立;存在則只追加內容;】"+" 表示可以同時讀寫某個檔案r+,可讀寫檔案。【可讀;可寫;可追加】w+,寫讀----->沒啥卵用a+,同a"U"表示在讀取時,可以將 \r \n \r\n自動轉換成 \n (與 r 或 r+ 模式同使用)rUr+U"b"表示處理二進位檔案(如:FTP發送上傳ISO鏡像檔案,linux可忽略,windows處理二進位檔案時需標註)rb--->二進位檔案讀取,二進位檔案必須使用二進位模式開啟wbab不同模式使用練習:書寫一個檔案,內容如下:我愛北京天安門北京天安門上太陽升data = open("yestday",encoding="utf-8").read() --->全部讀取,預設為r(唯讀模式)print(data)執行結果:我愛北京天安門北京天安門上太陽升*******************************************************************************************當模式更改為唯寫模式時,會提示報錯,不可讀,並且會將yestday檔案內容清空data = open("yestday",‘w‘,encoding="utf-8").read()print(data)執行結果:io.UnsupportedOperation: not readable*******************************************************************************************data = open("yestday",‘a‘,encoding="utf-8")data.write("\nwelcome")執行結果:無傳回值,可以查看yestday檔案是否在尾部增加了welcome的字元*******************************************************************************************yestday檔案內容:You Are My Baby!Come on!!!Come on!!!Come on!!!welcomedata = open("yestday",‘r+‘,enconding="utf-8")print(data.readline())print(data.readline())data.write("\nBeiJing")執行結果:You Are My Baby!Come on!!!查看yestday檔案內容:You Are My Baby!Come on!!!Come on!!!Come on!!!welcomeBeiJing★★r+讀寫入模式,只能在尾部追加,無法在檔案內部進行插入,比如上面先讀取了2行,再寫入BeiJing,查看檔案的變化是在尾部增加了該字串。
1.3、file對象常用函數
file對象使用open函數來建立,以下為file對象常用的函數:
| 序號 |
方法 |
描述 |
| 1 |
file.close() |
關閉檔案。關閉後檔案不能再進行讀寫操作。 |
| 2 |
file.flush() |
重新整理檔案內部緩衝,直接把內部緩衝區的資料立刻寫入檔案, 而不是被動的等待輸出緩衝區寫入。 |
| 3 |
file.fileno() |
返回一個整型的檔案描述符(file descriptor FD 整型), 可以用在如os模組的read方法等一些底層操作上。 |
| 4 |
file.isatty() |
如果檔案串連到一個終端裝置返回 True,否則返回 False。 |
| 5 |
file.next() |
返迴文件的下一行 |
| 6 |
file.read([size]) |
從檔案讀取指定的位元組數,如果未給定或為負則讀取所有。 |
| 7 |
file.readline([size]) |
讀取整行,包括 "\n" 字元。 |
| 8 |
file.seek() |
設定檔案的當前位置 |
| 9 |
file.tell() |
返迴文件的當前位置 |
| 10 |
file.truncate([size]) |
從檔案的首行首字元開始截斷,截斷檔案為 size 個字元,無 size 表示從當前位置截斷;截斷之後 V 後面的所有字元被刪除,其中 Widnows 系統下的換行代表2個字元大小。 |
| 11 |
file.write(str) |
將字串寫入檔案,沒有傳回值 |
| 12 |
file.writelines(sequence) |
向檔案寫入一個序列字串列表,如果需要換行則要自己加入每行的分行符號。 |
進度條練習:---->使用flush重新整理緩衝區
import sys,timefor i in range(10): sys.stdout.write("#") sys.stdout.flush() time.sleep(0.1)執行結果:##########
檔案的修改練習:---->通過將修改的內容儲存到一個新的檔案當中
檔案內容如下:
我愛北京天安門
天安門上太陽升
張傑
林俊傑
周杰倫
file = open("yestday","r",encoding="utf-8")filenew = open("yestdaynew",‘w‘,encoding="utf-8")for line in file: if "張傑" in line: line = line.replace("張傑","謝娜") filenew.write(line)file.close()filenew.close()執行結果:產生了yestdaynew檔案,內容如下:我愛北京天安門天安門上太陽升謝娜林俊傑周杰倫
1.4、with語句
為了避免開啟檔案後忘記關閉,可以通過管理上下文,即:
with open(‘log‘,‘r‘) as f:
如此方式,當with代碼塊執行完畢時,內部會自動關閉並釋放檔案資源。
在Python 2.7 後,with又支援同時對多個檔案的上下文進行管理,即:
with open(‘log1‘) as obj1, open(‘log2‘) as obj2:
with open("yestday",‘r‘,encoding="utf-8") as file: for line in file: print(line)執行結果:我愛北京天安門天安門上太陽升張傑林俊傑周杰倫with open("yestday",‘r‘,encoding="utf-8") as file , open("yestday",‘r‘,encoding="utf-8") as file2: for line in file2: print(line)執行結果:我愛北京天安門天安門上太陽升張傑林俊傑周杰倫
2、字元編碼和轉碼
詳細文章:
python編碼終極版
2.1需知
1.在python2預設編碼是ASCII, python3裡預設是unicode
[[email protected] ~]# pythonPython 2.7.5 (default, Aug 4 2017, 00:39:18) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import sys>>> print(sys.getdefaultencoding())asciiC:\Users\Administrator>pythonPython 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32Type "help", "copyright", "credits" or "license" for more information.>>> import sys>>> print(sys.getdefaultencoding())utf-8>>>
2.unicode 分為 utf-32(佔4個位元組),utf-16(佔兩個位元組),utf-8(佔1-4個位元組), 所以 utf-16就是現在最常用的unicode版本, 不過在檔案裡存的還是utf-8,因為utf8省空間
3.在py3中encode,在轉碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string
4.Unicode與utf8的關係:
一言以蔽之:Unicode是記憶體編碼錶示方案(是規範),而UTF是如何儲存和傳輸Unicode的方案(是實現)這也是UTF與Unicode的區別。
in python 2.x#author = KIM#-*-coding:utf-8-*- -->申明編碼的方式為utf-8import sysprint(sys.getdefaultencoding()) -->python 2.x中預設的編碼是asciimsg = "你好"msg_to_gbk = msg.decode("utf-8").encode("gbk")print(msg_to_gbk)執行結果:[[email protected] ~]# python encode.py ascii?o --->亂碼此處將utf-8編碼轉為gbk的編碼過程:msg解碼(decode)為unicode,再編碼(encode)為gbk。而預設的的編碼格式為utf-8,gbk格式明文顯示會出現亂碼。in python 3.ximport sysprint(sys.getdefaultencoding()) msg = "我愛北京天安門"msg_gbk = msg.encode("gbk") -->預設就是unicode,不需要decodemsg_utf8 = msg.encode("utf-8")msg_unicode = msg.encode("gbk").decode("gbk")print(msg_gbk)print(msg_utf8 )print(msg_unicode)執行結果:utf-8b‘\xce\xd2\xb0\xae\xb1\xb1\xbe\xa9\xcc\xec\xb0\xb2\xc3\xc5‘b‘\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8‘我愛北京天安門
Python入門篇(五)之檔案操作和字元編碼