python的編碼與文件讀寫

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次方)屎飘。
二進(jìn)制類比
  • 以此類推妥曲,當(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)票从,這是計算機里最常用的單位漫雕。
比特與字節(jié)
  • bit和byte長得有點像滨嘱,可別混淆!1 byte = 8 bit蝎亚,也就是1字節(jié)等于8比特九孩。
字節(jié)比特?fù)Q算

  • 百兆寬帶先馆,下載速度最多能達(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ī)則)
字母K不同進(jìn)制
幾種編碼方案在當(dāng)前的使用情況
  • 計算機是有自己的工作區(qū)的,這個工作區(qū)被稱為“內(nèi)存”审残。數(shù)據(jù)在內(nèi)存當(dāng)中處理時梭域,使用的格式是Unicode,統(tǒng)一標(biāo)準(zhǔn)维苔。
計算機內(nèi)存
  • 在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() 打開這個文件瞎嬉。

讀文件總結(jié)

寫入文件

  • 寫文件也是三步:打開文件——寫入文件——關(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)容,而是音頻和圖片的話红且,該怎么做
open()函數(shù)
  • '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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸥诽,一起剝皮案震驚了整個濱河市商玫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牡借,老刑警劉巖拳昌,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钠龙,居然都是意外死亡炬藤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門俊鱼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刻像,“玉大人,你說我怎么就攤上這事并闲∠杆” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵帝火,是天一觀的道長溜徙。 經(jīng)常有香客問我,道長犀填,這世上最難降的妖魔是什么蠢壹? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮九巡,結(jié)果婚禮上图贸,老公的妹妹穿的比我還像新娘。我一直安慰自己冕广,他們只是感情好疏日,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撒汉,像睡著了一般沟优。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睬辐,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天挠阁,我揣著相機與錄音,去河邊找鬼溯饵。 笑死侵俗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丰刊。 我是一名探鬼主播坡慌,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼藻三!你這毒婦竟也來了洪橘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤棵帽,失蹤者是張志新(化名)和其女友劉穎熄求,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逗概,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡弟晚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了逾苫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卿城。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖铅搓,靈堂內(nèi)的尸體忽然破棺而出瑟押,到底是詐尸還是另有隱情,我是刑警寧澤星掰,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布多望,位于F島的核電站,受9級特大地震影響氢烘,放射性物質(zhì)發(fā)生泄漏怀偷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一播玖、第九天 我趴在偏房一處隱蔽的房頂上張望椎工。 院中可真熱鬧,春花似錦蜀踏、人聲如沸维蒙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽木西。三九已至,卻和暖如春随静,著一層夾襖步出監(jiān)牢的瞬間八千,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工燎猛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恋捆,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓重绷,卻偏偏與公主長得像沸停,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昭卓,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348