1,編碼問題python
(1)請問python2與python3中的默認編碼是什麼?編程
python 2.x默認的字符編碼是ASCII,默認的文件編碼也是ASCII python 2.x默認的字符編碼是unicode,默認的文件編碼也是utf-8
(2)爲何會出現中文亂碼,你能舉例說明亂碼的狀況有哪幾種?python3.x
不管以什麼編碼在內存裏顯示字符,存到硬盤上都是2進制,因此編碼不對,程序就會出錯了。 (ascii編碼(美國),GBK編碼(中國),shift_JIS編碼(日本),,,,) 要注意的是,存到硬盤上時是以何種編碼存的,再從硬盤上讀出來時,就必須以何種編碼讀,要否則就亂了。。 常見的編碼錯誤的緣由有: python解釋器的默認編碼 Terminal使用的編碼 python源文件文件編碼 操做系統的語言設置,掌握了編碼以前的關係後,挨個排錯就ok
(3)如何進行編碼轉換?app
若是想要中國的軟件能夠正常的在美國人的電腦上實現,有下面兩種方法:
1
,讓美國人的電腦都裝上gbk編碼
2
,讓你的軟件編碼以utf
-
8
編碼
第一種方法不可現實,第二種方法比較簡單,可是也只能針對新開發的軟件,
若是你以前開發的軟件就是以gbk的編碼寫的,上百萬行代碼已經寫出去了,
從新編碼成utf
-
8
格式也會費很大力氣。
因此,針對已經用gbk開發的軟件項目如何讓項目在美國人的電腦上正常顯示
還記得
unicode
的一個功能就是其包含了跟全球全部國家編碼的映射關係,
因此不管你以什麼編碼存儲的數據,只要咱們的軟件把數據從硬盤上讀到內存,
轉成
unicode
來顯示便可,因爲全部的系統,編程語言都默認支持
unicode
,
全部咱們的gbk軟件放在美國電腦上,加載到內存裏面,變成了
unicode
,中文就可正常展現
(4)#_*_coding:utf-8_*_ 的做用是什麼?編程語言
#_*_coding:utf-8 _*_ 的做用是.py文件是什麼編碼,就須要告訴python用什麼編碼去讀取這個.py文件
(5)解釋python2.x bytes與python3.x bytes的區別學習
簡單點說:
編碼
Python
2
將 strings 處理爲原生的 bytes 類型,而不是
unicode
,
Python
3
全部的 strings 均是
unicode
類型。
在python2.x中,寫字符串,好比 >>>s = 」學習「 >>>print s 學習 >>>s '\xd1\xa7\xcf\xb0' 雖說打印的是學習,可是直接調用的變量s,確實一個個16進製表示的二進制字節, 咱們稱這個爲byte類型,即字節類型,它把8個二進制一組稱爲一個byte,用16進製表示 因此說python2.x的字符串其實更應該稱爲字符串,經過存儲的方式就能看出來, 可是在python2.x中還有一個bytes類型,兩個是否相同呢,回答是確定的,在python2.x中,bytes==str python3.x中 把字符串變成了unicode,文件默認編碼編程了utf-8,這意味着,只要用python3.x, 不管咱們的程序以那種語言開發,均可以在全球各國電腦上正常顯示。 python3.x除了把字符串的編碼改爲了unicode,還把str和bytes作了明確區分, str就是unicode格式的字符串bytes就是單純的二進制 (補充一個問題,爲何在python3.x中,把unicode編碼後,字符串就變成了bytes格式 ,爲何不直接打印成gbk的字符,我以爲就是想經過這樣的方式明確的告訴你,想在python3.x中看字符, 必須是unicode,其餘編碼一概是bytes格式)
2,文件處理、spa
(1) r和rb的區別是什麼?操作系統
文件操做時候,以「r"或者」rb"模式打開,只能讀取,沒法寫入; 硬盤上保存的文件都是某種編碼的0101010,打開時須要注意: rb,直接讀取文件保存時原生的0101010,在Python中用字節類型表示 r和encoding,讀取硬盤的0101010,並按照encoding指定的編碼格式進行斷句, 再將「斷句」後的每一段0101010轉換成unicode的 010101010101,在Python中用字符串類型表示
(2)解釋一下下面三個參數的做用分別是什麼?code
open
(f_name,
'r'
,encoding
=
"utf-8"
)
f_name 是文件的路徑,mode是打開的方式,encoding是編碼格式 encoding #文件編碼 mode #打開模式 name #文件名 newlines #文件中用到的換行模式,是一個tuple softspace #boolean型,通常爲0,聽說用於print
(3) w和wb的區別是什麼?
文件操做時候,以 「w」或「wb」 模式打開,則只能寫,而且在打開的同時會先將內容清空。 寫入到硬盤上時,必須是某種編碼的0101010,打開時須要注意: wb,寫入時須要直接傳入以某種編碼的0100101,即:字節類型 w 和 encoding,寫入時須要傳入unicode字符串,內部會根據encoding制定的編碼 將unicode字符串轉換爲該編碼的 010101010
(4)a和ab的區別是什麼?
文件操做時,以 「a」或「ab」 模式打開,則只能追加,即:在原來內容的尾部追加內容 寫入到硬盤上時,必須是某種編碼的0101010,打開時須要注意: ab,寫入時須要直接傳入以某種編碼的0100101,即:字節類型 a 和 encoding,寫入時須要傳入unicode字符串,內部會根據encoding制定的編碼 將unicode字符串轉換爲該編碼的 010101010
(5)readline和readlines的區別
readline() #讀取一行 readlines() #讀取全部內容,並返回列表(一行爲列表的一個元素值)
練習題1 —— 全局替換程序:
寫一個腳本,容許用戶按如下方式執行時,便可以對指定文件內容進行全局替換
`python your_script.py old_str new_str filename`
替換完畢後打印替換了多少處內容
練習題2 —— 模擬登錄:
user_name = 'alex' password = 123 user_info = {} count = 0 f = open('saa.txt.new', 'r+', encoding='utf-8') file = f.read() f.close() print('請登錄'.center(30, '*')) while count < 3: name = input('請輸入用戶名 : ') key = input('請輸入密碼 : ') key = int(key) if name in file: print('你的用戶被鎖定了') break elif name not in file: if name == user_name and key == password: print('登錄成功'.center(30, '-')) f2 = open('saz.txt', 'w', encoding='utf-8') user_info[user_name] = password f2.write(str(user_info)) f2.close() break else: print('用戶名或密碼錯誤,請再試%s次' % (2-count)) count += 1 if count == 3: print('你的帳戶已被鎖定'.center(30, '*')) f = open('saa.txt.new', 'r+', encoding='utf-8') file = f.write(name) f.close()