字符编码以及文件处理
目錄
- 字符編碼
- python2與python3的區別
- 基本的文件操作
- 絕對路徑和相對路徑
- 1.絕對路徑
- 2.相對路徑
- 文件的三種打開模式
- with管理文件操作上下文
- 文件的高級應用
- 1.可讀可寫
- 文件修改的兩種方式
字符編碼
按照什么編碼,就按什么解碼!!! |
python2與python3的區別
在Python2中如果指定了字符編碼,那么內存存取就會按照指定的字符編碼去入內存。解釋或去執行時就要按照指定了的字符編碼去解釋,否則就會亂碼。 否則可以在定義變量前面加上u,這樣變量就會以unicode編碼存入內存。
但在Python3中就不會有這樣的問題,因為無論你指定了什么字符編碼,在內存存取時都會使用Unicode編碼去入內存,Unicode編碼可以和任意的字符編碼相互轉換,并在讀取時按照所需的編碼區讀取,這樣就很好解決了字符編碼的問題
基本的文件操作
1.什么是文件?
就是只要我們想要操作文件就是對操作系統發起請求,然后由操作系統將用戶或應用程序對文件的讀寫操作轉換成集體的硬盤指令(比如控制盤片轉動,控制機械手臂移動,以此來讀取數據)。
2.為什么要有文件?
內存無法永久保存數據,但凡我們想要永久保存數據都需要把文件保存到硬盤中,而操作文件就可以實現對硬件的操作。
其實總的來說打開文件總而言之分為三步:
絕對路徑和相對路徑
1.絕對路徑
就是從根目錄開始的完整地址的路徑描寫方式
2.相對路徑
相對于當前執行文件所在的文件夾開始找。
文件的三種打開模式
文件操作的基礎模式有三種(默認的操作模式為r模式):
- r模式為read
- w模式為write
- a模式為append
文件讀寫內容的格式有兩種(默認的讀寫內容的模式為b模式):
- t模式為text
- b模式為bytes
需要注意的是:t、b這兩種模式均不能單獨使用,都需要與r/w/a之一連用。
r: read,只讀模式,只能讀不能寫,文件不存在時報錯。
w: 只能寫,不能讀,文件存在的時候回清空文件后再寫入內容;文件不存在的時候會創建文件后寫入內容。
a: 可以追加。文件存在,則在文件的末端寫入內容;文件不存在的時候會創建文件后寫入內容。
b模式是通用的模式,因為所有的文件在硬盤中都是以二進制的形式存儲的,需要注意的是:b模式讀寫文件,一定不能加上encoding參數,因為二進制無法再編碼。(基本用不到,除非操作圖片)
with管理文件操作上下文
之前我們使用open()方法操作文件,但是open打開文件后我們還需要手動釋放文件對操作系統的占用。但是其實我們可以更方便的打開文件,即Python提供的上下文管理工具——with open()。
with open('32.txt', 'rt', encoding='utf8') as f:print(f.read()) sdfwith open()方法不僅提供自動釋放操作系統占用的方法,并且with open可以使用逗號分隔,一次性打開多個文件,實現文件的快速拷貝。
with open('32.txt', 'rb') as fr, \open('35r.txt', 'wb') as fw:f.write(f.read())文件的高級應用
1.可讀可寫
- r+t: 可讀、可寫
- w+t: 可寫、可讀
- a+t: 可追加、可讀
2.文件內指針移動
with open('36r.txt', 'r+t', encoding='utf-8') as fr:fr.readline()fr.write('nick 真衰呀') # 寫在文件的最后一行硬盤上從來沒有修改一說,硬盤上只有覆蓋,即新內容覆蓋新內容。
1.seek(offset,whence): offset代表文件指針的偏移量,單位是字節
# seek() with open('36r.txt', 'rt', encoding='utf-8') as fr:print(f"fr.seek(4, 0): {fr.seek(3, 0)}") # 0相當于文件頭開始;1相當于當前文件所在位置;2相當于文件末尾# fr.seek(0,2) # 切換到文件末尾 fr.seek(4, 0): 32.tell(): 每次統計都是從文件開頭到當前指針所在位置
# tell() with open('36r.txt', 'rt', encoding='utf-8') as fr:fr.seek(4, 0)print(f"fr.tell(): {fr.tell()}") fr.tell(): 43.read(n): 只有在模式下的read(n),n代表的是字符個數,除此之外,其他但凡涉及文件指針的都是字節個數
# read() with open('36r.txt', 'rt', encoding='utf-8') as fr:print(f"fr.read(3): {fr.read(3)}") fr.read(3): sdf4.truncate(n): truncate(n)是截斷文件,所以文件的打開方式必須可寫,但是不能用w或w+等方式打開,因為那樣直接清空文件了,所以truncate()要在r+或a或a+等模式下測試效果。它的參照物永遠是文件頭。并且truncate()不加參數,相當于清空文件。
# truncate() with open('36r.txt', 'r+t', encoding='utf-8') as fr:fr.truncate(3)文件修改的兩種方式
文件的數據是存放于硬盤上的,因而只存在覆蓋、不存在修改這么一說,我們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式。
1.方式一
import oswith open('37r.txt') as fr, \open('37r_swap.txt', 'w') as fw:data = fr.read() # 全部讀入內存,如果文件很大,會很卡data = data.replace('tank', 'tankSB') # 在內存中完成修改fw.write(data) # 新文件一次性寫入原文件內容# 刪除原文件 os.remove('37r.txt') # 重命名新文件名為原文件名 os.rename('37r_swap.txt', '37r.txt') print('done...') done...2.方式二
import oswith open('37r.txt') as fr,\open('37r_swap.txt', 'w') as fw:# 循環讀取文件內容,逐行修改for line in fr:line = line.replace('jason', 'jasonSB')# 新文件寫入原文件修改后內容fw.write(line)os.remove('37r.txt') os.rename('37r_swap.txt', '37r.txt') print('done...') done...總而言之,修改文件內容的思路為:以讀的方式打開原文件,以寫的方式打開一個新的文件,把原文件的內容進行修改,然后寫入新文件,之后利用os模塊的方法,把原文件刪除,重命名新文件為原文件名,達到以假亂真的目的。
轉載于:https://www.cnblogs.com/xiongchao0823/p/11317429.html
總結
以上是生活随笔為你收集整理的字符编码以及文件处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 操作 redis 常用命令
- 下一篇: 破解win2003“终端服务器授权”激活