開發(fā)|淺談文件操作與字符編碼
聽說Python的文件操作很容易在某一些電腦上出問題,然而罪魁禍?zhǔn)拙褪亲址幋a。讓我們來了解一些底層的編碼方式。
前言
目前所有的文章思想格式都是:知識(shí) 情感。
知識(shí):對(duì)于所有的知識(shí)點(diǎn)的描述。力求不含任何的自我感情色彩。
情感:用我自己的方式,解讀知識(shí)點(diǎn)。力求通俗易懂,完美透析知識(shí)。
正文
本文主要分為兩大部分,一部分是如何使用Python進(jìn)行文件操作,另一部分是聊一下字符編碼的那些事。(比較繞,盡量用最最最通俗的話表述~~)
文件操作
1.文件操作方式
open()
close()
直接看源碼吧~~
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True):
"""
Open file and return a stream. Raise OSError upon failure.
========= ===============================================================
Character Meaning
--------- ---------------------------------------------------------------
'r' open for reading (default)
'w' open for writing, truncating the file first
'x' create a new file and open it for writing
'a' open for writing, appending to the end of the file if it exists
'b' binary mode
't' text mode (default)
' ' open a disk file for updating (reading and writing)
'U' universal newline mode (deprecated)
========= ===============================================================
"""
pass
2.文件操作mode
'r' 只讀
'w' 清空文件內(nèi)容,只寫
'a' 打開文件,追加內(nèi)容
'b' 二進(jìn)制操作文件,所以就有rb/wb/ab
' ' 增加讀寫的功能,plus的功能~,所以就有w /r
3.讀文件
1)最常用的是使用with 語句打開文件,不需要考慮關(guān)閉文件,自動(dòng)進(jìn)行文件的關(guān)閉
2)使用文件句柄f進(jìn)行打開文件,必須自己指定關(guān)閉文件
3)文件讀取的時(shí)候,可以使用 read() 讀取所有的文件,也可以使用readline() 讀取文件的一行
4)注意原始文件的編碼,不指定pycharm默認(rèn)的是utf-8,編碼錯(cuò)誤就亂碼
4.寫文件
1)寫數(shù)據(jù)到文件,使用 write()函數(shù),但是不是直接寫到硬盤中,是先寫到內(nèi)存中,過一定時(shí)間之后寫到硬盤中。
2)可以使用 flush() (強(qiáng)刷內(nèi)存中數(shù)據(jù)到硬盤)
5.文件的常用操作
關(guān)鍵點(diǎn):文件中光標(biāo)的位置
seek() # (注意:文件的編碼,整數(shù)倍的文件編碼單元的字節(jié))
truncate() # 截?cái)鄶?shù)據(jù)
tell() # 返回光標(biāo)的位置
修改文件局部內(nèi)容
占內(nèi)存修改
占硬盤修改
6.附加了解內(nèi)容
1)給文件重命名
可以使用 : os.rename() 或者 os.replace()
注意:在使用with打開文件重命名的時(shí)候,會(huì)報(bào)錯(cuò),原因是當(dāng)前文件還沒有被關(guān)閉,是沒有辦法重命名的,可以更換打開方式,使用文件句柄打開。
2)sys.argv
sys.argv[]是從程序外部獲取參數(shù)
sys.argv[0]表示代碼本身文件路徑
不理解的可以參考一下 這篇文章;https://www.cnblogs.com/aland-1415/p/6613449.html
字符編碼
基礎(chǔ)知識(shí)
1.二進(jìn)制是什么?
二進(jìn)制是0與1,計(jì)算機(jī)只認(rèn)識(shí)二進(jìn)制。但是人并不認(rèn)識(shí)計(jì)算機(jī)認(rèn)識(shí)的二進(jìn)制(命令轉(zhuǎn)化的二進(jìn)制)。人只認(rèn)知命令。那么命令如何變?yōu)槎M(jìn)制就是需要解決的問題。
2.ASCII表可以干什么?
ASCII表表示的256個(gè)字符的順序表。既然有順序,那么人可以讀的是十進(jìn)制,而十進(jìn)制可以變?yōu)槎M(jìn)制,所以ASCII表也就是起到了特殊字符映射到二進(jìn)制的作用。
Python查看輸入字符對(duì)應(yīng)的二進(jìn)制的十進(jìn)制數(shù)是多少的函數(shù): ord('a')
注意:此時(shí)我們就可以輸入ASCII表中的字符,就會(huì)轉(zhuǎn)為二進(jìn)制,計(jì)算機(jī)就看懂了。見下圖ASCII表:

3.數(shù)據(jù)的表示
在計(jì)算機(jī)中,規(guī)定一個(gè)二進(jìn)制數(shù)為一個(gè)bit(位)。
八個(gè)二進(jìn)制數(shù)為八個(gè)bit,稱為1個(gè)bytes,表示1個(gè)字節(jié)。
進(jìn)而:1KB=1024B
GB2312與GBK
在基礎(chǔ)知識(shí),已經(jīng)知道了ASCII表是做什么的,那么現(xiàn)在可以表示ASCII表中的字符到計(jì)算機(jī)中了,此時(shí)其他除了ASCII表中的字符去哪里找,有怎么存儲(chǔ)到計(jì)算機(jī)中?
中國,最先使用的是 GB2312,隨著需要表示字符數(shù)量的增多,開始使用GBK。此時(shí)就可以將漢字轉(zhuǎn)換為計(jì)算機(jī)可以看懂的二進(jìn)制數(shù)。
注意: GBK是在ASCII表中的進(jìn)行的字符映射擴(kuò)展。此時(shí)表示一個(gè)漢字需要2個(gè)字節(jié)。
unicode
unicode編碼,是將全球的語言字符進(jìn)行了整合,所有的語言字符都可以在unicode中找到。
注意:unicode編碼的所有字符全部需要4個(gè)字節(jié)。
utf家族
utf家族的代表明星是: utf-8。
由于使用unicode編碼,文件的存儲(chǔ)變大,并且不利于網(wǎng)絡(luò)數(shù)據(jù)的傳輸和存儲(chǔ),所以改進(jìn)的方式是utf家族,其中使用對(duì)多的就是utf-8.
UTF-8: 使用1、2、3、4個(gè)字節(jié)表示所有字符;優(yōu)先使用1個(gè)字符、無法滿足則使增加一個(gè)字節(jié),最多4個(gè)字節(jié)。英文占1個(gè)字節(jié)、歐洲語系占2個(gè)、東亞(中國)占3個(gè),其它及特殊字符占4個(gè)
編碼的轉(zhuǎn)換
1.前提知識(shí):
1)計(jì)算機(jī)的內(nèi)存中數(shù)據(jù),也就是內(nèi)存中的二進(jìn)制0和1,是使用 unicode 編碼。
2)所有的網(wǎng)絡(luò)傳輸與數(shù)據(jù)存儲(chǔ)(硬盤上的數(shù)據(jù)),是使用utf-8 編碼。
3)Windows系統(tǒng)的編碼是 gbk。
2.不同編碼轉(zhuǎn)換方法
使用unicode編碼作為中介,首先將源編碼文件進(jìn)行解碼(decode()解碼)成為unicode,再將unicode編碼(encode())成為目標(biāo)編碼格式。
3.pycharm中聲明編碼格式
推薦聲明:coding:utf-8 # -- encoding:utf-8 --
注意:第一行寫編碼聲明,此時(shí)pycharm會(huì)自動(dòng)將該文件的編碼格式變?yōu)閡tf-8.自己留意書寫與不寫聲明,pycharm右下角的變化。
結(jié)束語
小結(jié)一下,文件操作中,使用with語句打開的時(shí)候,如果對(duì)文件繼續(xù)操作,不手動(dòng)關(guān)閉,會(huì)報(bào)錯(cuò)。(自己踩得大坑,with語句不會(huì)在跳出with之后自動(dòng)關(guān)閉,有一定的時(shí)延)
字符編碼,真心不好理解,其實(shí)最簡單的方式就是,分開看內(nèi)存,硬盤,操作系統(tǒng),軟件,以及對(duì)應(yīng)的編碼是什么,就會(huì)很清楚了,祝大家學(xué)習(xí)愉快~~
一點(diǎn)感悟:時(shí)間很快,就是轉(zhuǎn)眼間的事,盡量將自己的時(shí)間進(jìn)行量化~~~
來源:https://www./content-4-351051.html
|