python基礎(chǔ)語法
編碼與文件讀寫
編碼
- 編碼的本質(zhì)就是讓只認(rèn)識0和1的計算機,能夠理解我們?nèi)祟愂褂玫恼Z言符號,并且將數(shù)據(jù)轉(zhuǎn)換為二進(jìn)制進(jìn)行存儲和傳輸苇本。
- 從人類語言到計算機語言轉(zhuǎn)換的形式亮隙,就叫做編碼表茶宵,它讓人類語言和計算機語言能夠一一對應(yīng)起來桐愉。
二進(jìn)制
- 由于有二進(jìn)制财破,0和1這兩個數(shù)字才能像“太極生兩儀,兩儀生四象从诲,四象生八卦”一樣左痢,涵蓋容納世間所有的信息。
類比
- 現(xiàn)在有兩座烽火臺系洛,右邊為第1座俊性,左邊為第2座。我們約定描扯,當(dāng)沒有烽火臺被點著的時候定页,表示沒有敵人(00);只點著第一座烽火臺的時候荆烈,表示來了一個敵人(01)拯勉;只點著第二座烽火臺的時候,表示來了2個敵人憔购。(10,逢二進(jìn)一)
- 當(dāng)兩座烽火臺都被點著的時候(11)宫峦,就表示來了3個人。
二進(jìn)制 - 十進(jìn)制
00 - 0
01 - 1
10 - 2
11 - 3
兩個二進(jìn)制位可以表示十進(jìn)制的0,1,2,3四種狀態(tài)玫鸟。
- 繼續(xù)往下推导绷,當(dāng)有三座烽火臺的時候,我們可以表示0~7八種狀態(tài)(也就是2的3次方)屎飘。
- 以此類推妥曲,當(dāng)有八座烽火臺的時候,我們就能表示2的8次方钦购,也就是256種狀態(tài)檐盟,它由8個0或1組成。
00000000 表示狀態(tài)0: 烽火全暗押桃,一個敵人沒有葵萎,平安無事。
11111111 表示狀態(tài)255:烽火全亮唱凯,來了255個敵人羡忘。
- 用來存放一位0或1,就是計算機里最小的存儲單位磕昼,叫做【位】卷雕,也叫【比特】(bit)。我們規(guī)定8個比特構(gòu)成一個【字節(jié)】(byte)票从,這是計算機里最常用的單位漫雕。
- bit和byte長得有點像滨嘱,可別混淆!1 byte = 8 bit蝎亚,也就是1字節(jié)等于8比特九孩。
- 百兆寬帶先馆,下載速度最多能達(dá)到十多兆发框,是因為運營商的帶寬是以(bit/s)比特每秒為單位的,比如100M就是100Mbit/s煤墙。
- 我們趁饭撸看到的下載速度KB卻是以字節(jié)每秒(byte/s)為單位顯示的,1byte = 8bit仿野,所以運營商說的帶寬得先除以8铣减,你的百兆寬帶下載速度,也就是十幾兆了脚作。
編碼表
- 計算機只識“數(shù)”葫哗,因此人們必須告訴計算機哪個數(shù)字來代表哪個特定字符。
- 除了0球涛、1這些阿拉伯?dāng)?shù)字劣针,像a、b亿扁、c這樣的52個字母(包括大小寫)捺典,還有一些常用的符號(例如、#从祝、@等)在計算機中存儲時也要使用二進(jìn)制數(shù)來表示襟己,而具體用哪些二進(jìn)制數(shù)字表示哪個符號,理論上每個人都可以有自己的一套規(guī)則(這就叫編碼)牍陌。
- 如果想要互相溝通而不造成混亂擎浴,就必須使用相同的編碼規(guī)則。如果使用了不同的編碼規(guī)則毒涧,那就會彼此讀不懂贮预,這就是“亂碼”的由來。
編碼歷史
- 為了避免亂碼链嘀,美國首先出臺了ASCII編碼(讀音:/??ski/)萌狂,統(tǒng)一規(guī)定了常用符號用哪些二進(jìn)制數(shù)來表示。
- ==英文字母怀泊、數(shù)字再加上其他常用符號茫藏,也就100來個,因此使用7個比特位(最多表示128位)就夠用了霹琼,所以一個字節(jié)中被剩下的那個比特位就被默認(rèn)為0务傲。==
- 再后來凉当,這套編碼表傳入歐洲,發(fā)現(xiàn)這128位不夠用啊售葡。比如說法語字母上面還有注音符看杭,這個怎么區(qū)分?把最后一個比特位也編進(jìn)來吧挟伙。因此歐洲普遍使用一個全字節(jié)(8個比特位)進(jìn)行編碼楼雹,最多可表示256位,至此尖阔,一個字節(jié)就用滿了贮缅!
- 前面的狀態(tài)0-127位可以共用,但從狀態(tài)128到255這一段的解釋就完全亂套了介却,比如135在法語谴供,希伯來語,俄語編碼中完全是不同的符號齿坷。
- 計算機漂洋過海來到中國后桂肌,問題又來了,計算機完全不認(rèn)識博大精深的中文永淌,當(dāng)然也沒法顯示中文崎场;而且一個字節(jié)的256位都被占滿了,但中國有10萬多個漢字仰禀,256位肯定不夠照雁。
- 中國科學(xué)家自力更生,重寫了一張編碼表答恶,也就是GB2312饺蚊,它用2個字節(jié),也就是16個比特位悬嗓,來表示絕大部分(65535個)常用漢字污呼。后來,為了能顯示更多的中文包竹,又出臺了GBK標(biāo)準(zhǔn)燕酷。
- 不僅中國,其他國家也都搞出自己的一套編碼標(biāo)準(zhǔn)周瞎。但這樣不同地區(qū)就無法溝通苗缩,日本人發(fā)封email給中國人,兩邊編碼表不同声诸,顯示的都是亂碼酱讶。
- 為了溝通的便利,Unicode(萬國碼)應(yīng)運而生彼乌,這套編碼表將世界上所有的符號都納入其中泻肯。每個符號都有一個獨一無二的編碼渊迁,現(xiàn)在Unicode可以容納100多萬個符號,所有語言都可以互通灶挟,一個網(wǎng)頁上也可以顯示多國語言琉朽。
- 但仍然存在問題,自從英文世界用了Unicode稚铣,為遷就一些占用字節(jié)比較多的語言箱叁,英文也要跟著占兩個字節(jié)。比如要存儲A榛泛,原本00010001就可以了蝌蹂,現(xiàn)在偏得用兩個字節(jié):00000000 00010001才行噩斟,這樣對計算機空間存儲是種極大的浪費曹锨!
- 基于這個痛點,科學(xué)家們又提出了天才的想法:UTF-8(8-bit Unicode Transformation Format)剃允。它是一種針對Unicode的可變長度字符編碼沛简,它可以使用1~4個字節(jié)表示一個符號,根據(jù)不同的符號而變化字節(jié)長度斥废,而當(dāng)字符在ASCII碼的范圍時椒楣,就用一個字節(jié)表示,所以UTF-8還可以兼容ASCII編碼牡肉。
- Unicode與UTF-8這種曖昧的關(guān)系一言以蔽之:==Unicode是內(nèi)存編碼的規(guī)范捧灰,而UTF-8是如何保存和傳輸Unicode的手段。==
- 這些編碼表就是計算機世界的字典辭書统锤,它們同樣也是人類智慧的結(jié)晶毛俏。
八進(jìn)制與十六進(jìn)制
- 因為二進(jìn)制是由一堆0和1構(gòu)成的,過長的數(shù)字對于人的閱讀有很大障礙饲窿,為了解決這一問題煌寇,也減少書寫的復(fù)雜性,我們又引入了八進(jìn)制和十六進(jìn)制逾雄。
- 2阀溶、8、16鸦泳,分別是2的1次方银锻、3次方、4次方做鹰。這一點使得三種進(jìn)制之間可以非常直接地互相轉(zhuǎn)換击纬。
- 8進(jìn)制是用0,1誊垢,2掉弛,3症见,4,5殃饿,6谋作,7;16進(jìn)制是用0乎芳,1遵蚜,2,3奈惑,4吭净,5,6肴甸,7寂殉,8,9原在,a友扰,b,c庶柿,d村怪,e,f來表示浮庐。比如說甚负,字母K在ASCII編碼表用不同進(jìn)制表示(并不需要知道具體的轉(zhuǎn)換規(guī)則)
幾種編碼方案在當(dāng)前的使用情況
- 計算機是有自己的工作區(qū)的,這個工作區(qū)被稱為“內(nèi)存”审残。數(shù)據(jù)在內(nèi)存當(dāng)中處理時梭域,使用的格式是Unicode,統(tǒng)一標(biāo)準(zhǔn)维苔。
- 在Python3當(dāng)中碰辅,程序處理我們輸入的字符串,是默認(rèn)使用Unicode編碼的介时,所以什么語言都可以輸入没宾。
- 數(shù)據(jù)在硬盤上存儲,或者是在網(wǎng)絡(luò)上傳輸時沸柔,用的是UTF-8循衰,因為節(jié)省空間。但你不必操心如何轉(zhuǎn)換UTF-8和Unicode褐澎,當(dāng)我們點擊保存的時候会钝,程序已經(jīng)“默默地”幫我們做好了編碼工作。
- 一些中文的文件和中文網(wǎng)站,還在使用GBK迁酸,和GB2312先鱼。
- 基于此,有時候面對不同編碼的數(shù)據(jù)奸鬓,我們要進(jìn)行一些操作來實現(xiàn)轉(zhuǎn)換焙畔。即解碼和編碼。
encode()和decode()
- 編碼串远,即將人類語言轉(zhuǎn)換為計算機語言宏多,就是【編碼】encode();反之澡罚,就是【解碼】decode()伸但。
print('八站'.encode('utf-8'))
print('八站'.encode('gbk'))
print(b'\xe5\x85\xab\xe7\xab\x99'.decode('utf-8'))
print(b'\xb0\xcb\xd5\xbe'.decode('gbk'))
'''
b'\xe5\x85\xab\xe7\xab\x99'
b'\xb0\xcb\xd5\xbe'
八站
八站
[Finished in 0.2s]
'''
- 將人類語言編碼后得到的結(jié)果,有一個相同之處留搔,就是最前面都有一個字母b更胖,比如b'\xce\xe2\xb7\xe3',這代表它是bytes(字節(jié))類型的數(shù)據(jù)催式。我們可以用type()函數(shù)驗證一下
print(type('八站'))
print(type(b'\xb0\xcb\xd5\xbe'))
'''
<class 'str'>
<class 'bytes'>
'''
- 所謂的編碼函喉,其實本質(zhì)就是把str(字符串)類型的數(shù)據(jù),利用不同的編碼表荣月,轉(zhuǎn)換成bytes(字節(jié))類型的數(shù)據(jù)。
- 字符和字節(jié)概念: 字符是人們使用的記號梳毙,一個抽象的符號哺窄,這些都是字符:'1', '中'账锹, 'a'萌业, '$', '¥' 奸柬。
- 字節(jié)則是計算機中存儲數(shù)據(jù)的單元生年,一個8位的二進(jìn)制數(shù)。
- 編碼結(jié)果中除了標(biāo)志性的字母b廓奕,你還會在編碼結(jié)果中看到許多\x抱婉,你再觀察一下這個例子:b'\xce\xe2\xb7\xe3'。
- \x是分隔符桌粉,用來分隔一個字節(jié)和另一個字節(jié)蒸绩。
- 分隔符很常見,經(jīng)常會看到網(wǎng)址里面有好多的%铃肯,它們也是分隔符患亿,替換了Python中的\x
\xe5\x90\xb4\xe6\x9e\xab # Python編碼的結(jié)果
%E5%90%B4%E6%9E%AB # 網(wǎng)址里的結(jié)果
# UTF-8編碼結(jié)果和這一串網(wǎng)址的差異,其實它們除了分隔符以外押逼,是一模一樣的步藕。
- 用decode()解碼的時候則要注意惦界,UTF-8編碼的字節(jié)就一定要用UTF-8的規(guī)則解碼,其他編碼同理咙冗,否則就會出現(xiàn)亂碼或者報錯的情況
print(b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'.decode('utf-8'))
# 我愛你
- ASCII編碼表锻,它不支持中文,所以我們來轉(zhuǎn)換一個大寫英文字母K乞娄。
print('K'.encode('ASCII'))
# b'K'
- 看到大寫字母K被編碼后還是K瞬逊,但這兩個K對計算機來說意義是不同的。前者是字符串仪或,采用系統(tǒng)默認(rèn)的Unicode編碼确镊,占兩個字節(jié)(byte)。后者則是bytes類型的數(shù)據(jù)范删,只占一個字節(jié)蕾域。
文件讀寫
- 文件讀寫,是Python代碼調(diào)用電腦文件的主要功能到旦,能被用于讀取和寫入文本記錄旨巷、音頻片段、Excel文檔添忘、保存郵件以及任何保存在電腦上的東西采呐。
- 當(dāng)你要從網(wǎng)上下載幾千條數(shù)據(jù)時,直接用Python幫你把數(shù)據(jù)一次性存入文件也是相當(dāng)方便搁骑。
- Python能把我們從重復(fù)性工作中解放出來
讀寫文件
- 讀文件有三步:打開文件——讀文件——關(guān)閉文件斧吐。
打開文件
- 【第1步-開】使用open()函數(shù)打開文件。
file1 = open('/Users/Ted/Desktop/test/abc.txt','r',encoding='utf-8')
- file1這個變量是存放讀取的文件數(shù)據(jù)的仲器,以便對文件進(jìn)行下一步的操作煤率。
- open()函數(shù)里面有三個參數(shù)
'/Users/Ted/Desktop/test/abc.txt'
'r'
encoding='utf-8'
- 第一個參數(shù)是文件的保存地址,一定要寫清楚乏冀,否則計算機找不到蝶糯。
- 要找到你的文件地址,只需要把你要打開的文件直接拖到編輯器終端的窗口里辆沦,就會顯示出文件地址昼捍,然后復(fù)制一下就好。
- 文件的地址有兩種:相對路徑和絕對路徑众辨,拖到終端獲取的地址是絕對路徑端三。這兩種地址,Mac和Windows電腦還有點不太一樣
- 絕對路徑就是最完整的路徑鹃彻,相對路徑指的就是【相對于當(dāng)前文件夾】的路徑郊闯,也就是你編寫的這個py文件所放的文件夾路徑!
- 如果你要打開的文件和open.py在同一個文件夾里,這時只要使用相對路徑就行了团赁,而要使用其他文件夾的文件則需使用絕對路徑育拨。
- Mac電腦
open('/Users/Ted/Desktop/test/abc.txt') #絕對路徑
open('abc.txt') #相對路徑
#相對路徑也可以寫成open('./abc.txt')
#在這種情況下,寫絕對和相對路徑都是可以的欢摄。
- 假如現(xiàn)在這個txt文件熬丧,是放在test文件夾下面一個叫做word的文件夾里,絕對路徑和相對路徑就變成:
open('/Users/Ted/Desktop/test/word/abc.txt'')
open('word/abc.txt')
- windows電腦
Windows系統(tǒng)里怀挠,常用\來表示絕對路徑析蝴,/來表示相對路徑。所以當(dāng)把文件拖入終端的時候绿淋,==絕對路徑==就變成
C:\Users\Ted\Desktop\test\abc.txt
- 但是\在Python中是轉(zhuǎn)義字符闷畸,所以時常會有沖突。為了避坑吞滞,Windows的==絕對路徑==通常要稍作處理佑菩,寫成以下兩種格式;
open('C:\\Users\\Ted\\Desktop\\test\\abc.txt')
#將'\'替換成'\\'
open(r'C:\Users\Ted\Desktop\test\abc.txt')
#在路徑前加上字母r
file1 = open('/Users/Ted/Desktop/test/abc.txt','r',encoding='utf-8')
- 第二個參數(shù)表示打開文件時的模式裁赠。這里是字符串 'r'殿漠,表示 read,表示我們以讀的模式打開了這個文件佩捞。
- 計算機非常注意數(shù)據(jù)的保密性绞幌,在打開時就要決定以什么模式打開文件。
- 除了'r',其他還有'w'(寫入)失尖,'a'(追加)等模式
- 第三個參數(shù)encoding='utf-8'啊奄,表示的是返回的數(shù)據(jù)采用何種編碼,一般采用utf-8或者gbk掀潮。注意這里是寫encoding而不是encode。
讀文件
打開文件file1之后琼富,就可以用read()函數(shù)進(jìn)行讀取的操作了仪吧。
file1 = open('/Users/Ted/Desktop/test/abc.txt', 'r',encoding='utf-8')
filecontent = file1.read()
- 第1行代碼是我們之前寫的。是以讀取的方式打開了文件“abc.txt”鞠眉。
- 第2行代碼就是在讀取file1的內(nèi)容薯鼠,寫法是變量file1后面加個.句點,再加個read()械蹋,并且把讀到的內(nèi)容放在變量filecontent里面出皇,這樣我們才能拿到文件的內(nèi)容。
- 想要看看讀到了什么數(shù)據(jù)哗戈,可以用print()函數(shù)看看郊艘。
file1 = open('C:\\Users\\bazhan\\Desktop\\python_Summary\\12\\test.txt','r',encoding='utf-8')
content = file1.read()
print(content)
- 結(jié)果會打印出了.txt文件里面的內(nèi)容,它會讀成字符串的數(shù)據(jù)形式。
關(guān)閉文件
- 關(guān)閉文件纱注,使用的是close()函數(shù)
file1 = open('C:\\Users\\bazhan\\Desktop\\python_Summary\\12\\test.txt','r',encoding='utf-8')
content = file1.read()
print(content)
file1.close()#括號不能丟
- 為啥要關(guān)閉文件?
- 計算機能夠打開的文件數(shù)量是有限制的畏浆,open()過多而不close()的話,就不能再打開文件了
- 能保證寫入的內(nèi)容已經(jīng)在文件里被保存好了狞贱。
- 文件關(guān)閉之后就不能再對這個文件進(jìn)行讀寫了刻获。如果還需要讀寫這個文件的話,就要再次 open() 打開這個文件瞎嬉。
寫入文件
- 寫文件也是三步:打開文件——寫入文件——關(guān)閉文件蝎毡。
【第1步-開】以寫入的模式打開文件。
file1 = open('/Users/Ted/Desktop/test/abc.txt','w',encoding='utf-8')
- 以寫入的模式打開了文件"abc.txt"氧枣。
- open() 中還是三個參數(shù)沐兵,其他都一樣,除了要把第二個參數(shù)改成'w'挑胸,表示write痒筒,即以寫入的模式打開文件。
【第2步-寫】往文件中寫入內(nèi)容茬贵,使用write()函數(shù)簿透。
file1 = open('/Users/Ted/Desktop/test/abc.txt', 'w',encoding='utf-8')
file1.write('張無忌\n')
file1.write('宋青書\n')
- 第2-3行代碼:往“abc.txt”文件中寫入了“張無忌”和“宋青書”這兩個字符串。\n表示另起一行解藻。
- 原來文件內(nèi)容會消失老充,'w'寫入模式會給你暴力清空掉文件,然后再給你寫入螟左。如果你只想增加?xùn)|西啡浊,而不想完全覆蓋掉原文件的話,就要使用'a'模式胶背,表示append
file1 = open('/Users/Ted/Desktop/test/abc.txt', 'a',encoding='utf-8')
#以追加的方式打開文件abc.txt
file1.write('張無忌\n')
#把字符串'張無忌'寫入文件file1
file1.write('宋青書\n')
#把字符串'宋青書'寫入文件file1
【第3步-關(guān)】還是要記得關(guān)閉文件巷嚣,使用close()函數(shù)
file1 = open('/Users/Ted/Desktop/test/abc.txt','a',encoding='utf-8')
file1.write('張無忌\n')
file1.write('宋青書\n')
file1.close()
- 說明
- write()函數(shù)寫入文本文件的也是字符串類型。
- 在'w'和'a'模式下钳吟,如果你打開的文件不存在廷粒,那么open()函數(shù)會自動幫你創(chuàng)建一個
- 如果我們想寫入的數(shù)據(jù)不是文本內(nèi)容,而是音頻和圖片的話红且,該怎么做
- 'wb'模式坝茎,它的意思是以二進(jìn)制的方式打開一個文件用于寫入。因為圖片和音頻是以二進(jìn)制的形式保存的暇番,所以使用wb模式就好了
- 補充一個用法嗤放,為了避免打開文件后忘記關(guān)閉,占用資源或當(dāng)不能確定關(guān)閉文件的恰當(dāng)時機的時候壁酬,我們可以用到關(guān)鍵字with
# 普通寫法
file1 = open('abc.txt','a')
file1.write('張無忌')
file1.close()
# 使用with關(guān)鍵字的寫法
with open('abc.txt','a') as file1:
#with open('文件地址','讀寫模式') as 變量名:
#格式:冒號不能丟
file1.write('張無忌')
#格式:對文件的操作要縮進(jìn)
#格式:無需用close()關(guān)閉
小練習(xí)
統(tǒng)計這四個學(xué)生的作業(yè)的總得分次酌,然后再寫入一個txt文件
羅恩 23 35 44
哈利 60 77 68 88 90
赫敏 97 99 89 91 95 90
馬爾福 100 85 90
- 補充
- readlines()恨课,也就是“按行讀取”
file1 = open('.//scores.txt','r',encoding='utf-8') # 打開
file_lines = file1.readlines()# 按行讀取
file1.close()
print(file_lines)
'''
['羅恩 23 35 44\n', '哈利 60 77 68 88 90\n', '赫敏 97 99 89 91 95 90\n', '馬爾福 100 85 90']
'''
- readlines() 會從txt文件取得一個列表,列表中的每個字符串就是scores.txt中的每一行和措。而且每個字符串后面還有換行的\n符號庄呈。
- 這樣一來,我們就可以使用for循環(huán)來遍歷這個列表派阱,然后處理列表中的數(shù)據(jù)
file1 = open('.\\scores.txt','r',encoding='utf-8')
file_lines = file1.readlines()
file1.close()
for i in file_lines: #用for...in...把每一行的數(shù)據(jù)遍歷
print(i) #打印變量i
- 接下來把每一行的名字诬留、分?jǐn)?shù)也分開,這時需要我們使用split()來把字符串分開贫母,它會按空格把字符串里面的內(nèi)容分開文兑。
- 羅恩 23 35 44,它將被分為['羅恩', '23', '35', '44']腺劣。
- split()把每一行的內(nèi)容分成了一個個的字符串绿贞,于是變成了一個個列表。
file1 = open('.\\scores.txt','r',encoding='utf-8')
file_lines = file1.readlines()
file1.close()
for i in file_lines: #用for...in...把每一行的數(shù)據(jù)遍歷
data =i.split() #把字符串切分成更細(xì)的一個個的字符串
print(data) #打印出來看看
- split()是把字符串分割的橘原,而還有一個join()函數(shù)籍铁,是把字符串合并的。
a=['c','a','t']
b=''
print(b.join(a))
c='-'
print(c.join(a))
#join()的用法是str.join(sequence)趾断,str代表在這些字符串之中拒名,你要用什么字符串連接,在這里兩個例子芋酌,一個是空字符串增显,一個是橫杠,sequence代表數(shù)據(jù)序列脐帝,在這里是列表a同云。
- 4個列表的第0個數(shù)據(jù)是姓名,之后的就是成績堵腹。我們需要先統(tǒng)計各人的總成績炸站,然后把姓名和成績放在一起。
#可以用for...in...循環(huán)進(jìn)行加法的操作
file1 = open(r'C:\Users\silin\Desktop\python_Summary\12\scores.txt','r',encoding='utf-8')
file_lines = file1.readlines()
file1.close()
for i in file_lines:
data =i.split()
sum = 0 #先把總成績設(shè)為0
for score in data[1:]: #遍歷列表中第1個數(shù)據(jù)和之后的數(shù)據(jù)
sum = sum + int(score) #然后依次加起來疚顷,但分?jǐn)?shù)是字符串武契,所以要轉(zhuǎn)換
result = data[0]+str(sum) #結(jié)果就是學(xué)生姓名和總分
print(result)
- 接下來就是把成績寫入一個空的列表,因為這樣才有助于我們之后寫入一個txt文件荡含。
file = open(r'C:\Users\silin\Desktop\python_Summary\12\scores.txt','r',encoding='utf-8')
file_lines = file.readlines()
file.close()
final_scores = []
for i in file_lines:
data =i.split()
sum = 0
for score in data[1:]:
sum = sum + int(score)
result = data[0]+str(sum)+'\n'
final_scores.append(result)
winner = open(r'C:\Users\silin\Desktop\python_Summary\12\scores.txt','w',encoding='utf-8')
winner.writelines(final_scores)
winner.close()
練習(xí)
通過文件讀寫,復(fù)制圖片
with open('photo2.png','rb') as file: # 以“rb”模式打開圖片
data = file.read()
with open('photo3.png','wb') as newfile: # 以“wb”模式寫入
newfile.write(data)
在讀寫之間處理數(shù)據(jù)-1
# 下面注釋掉的代碼届垫,皆為檢驗代碼(驗證每一步的思路和代碼是否達(dá)到目標(biāo)释液,可解除注釋后運行)。
file1 = open('winner.txt','r',encoding='utf-8')
file_lines = file1.readlines()
file1.close()
dict_scores = {}
list_scores = []
final_scores = []
# print(file_lines)
# print(len('\n'))
# 打印結(jié)果為:['羅恩102\n', '哈利383\n', '赫敏570\n', '馬爾福275\n']
# 經(jīng)過測試装处,發(fā)現(xiàn)'\n'的長度是1误债。所以浸船,名字是“第0位-倒數(shù)第5位”,分?jǐn)?shù)是“倒數(shù)第4位-倒數(shù)第二位”寝蹈。
# 再根據(jù)“左取右不取”李命,可知:name-[:-4],score-[-4:-1]
for i in file_lines: # i是字符串。
print(i)
name = i[:-4] # 取出名字(注:字符串和列表一樣箫老,是通過偏移量來獲取內(nèi)部數(shù)據(jù)封字。)
score = int(i[-4:-1]) # 取出成績
print(name)
print(score)
dict_scores[score] = name # 將名字和成績對應(yīng)存為字典的鍵值對(注意:這里的成績是鍵)
list_scores.append(score)
# print(list_scores)
list_scores.sort(reverse=True) # reverse,逆行耍鬓,所以這時列表降序排列阔籽,分?jǐn)?shù)從高到低。
# print(list_scores)
for i in list_scores:
result = dict_scores[i] + str(i) + '\n'
# print(result)
final_scores.append(result)
print(final_scores) # 最終結(jié)果
winner_new = open('winner_new.txt','w',encoding='utf-8')
winner_new.writelines(final_scores)
winner_new.close()
練習(xí)
我們以李商隱的《錦瑟》為例牲蜀,這是原文檔里的內(nèi)容:
錦瑟
[唐] 李商隱
錦瑟無端五十弦笆制,
一弦一柱思華年。
莊生曉夢迷蝴蝶涣达,
望帝春心托杜鵑在辆。
滄海月明珠有淚,
藍(lán)田日暖玉生煙度苔。
此情可待成追憶匆篓,
只是當(dāng)時已惘然。
老師在這首詩想考學(xué)生“一弦一柱思華年林螃∞壬荆”和“只是當(dāng)時已惘然×迫希”完残,即他想得到的是:
錦瑟
[唐] 李商隱
錦瑟無端五十弦,
__横漏。
莊生曉夢迷蝴蝶谨设,
望帝春心托杜鵑。
滄海月明珠有淚缎浇,
藍(lán)田日暖玉生煙扎拣。
此情可待成追憶,
__素跺。
list_test = ['一弦一柱思華年二蓝。\n','只是當(dāng)時已惘然。\n'] # 將要默寫的詩句放在列表里指厌。
with open ('poem2.txt','r') as f:
lines = f.readlines()
print(lines)
with open('poem2.txt','w') as new:
for line in lines:
if line in list_test: # 屬于默寫列表中的句子刊愚,將其替換成橫線。
new.write('____________踩验。\n')
else:
new.write(line)