Python編碼及檔案練習題

2022-08-10 05:48:14 字數 4163 閱讀 2612

python編碼及檔案練習題

1,編碼問題

(1)請問python2與python3中的預設編碼是什麼?

python 2.x預設的字元編碼是ascii,預設的檔案編碼也是ascii

python 2.x預設的字元編碼是unicode,預設的檔案編碼也是utf-8

(2)為什麼會出現中文亂碼,你能舉例說明亂碼的情況有哪幾種?

無論以什麼編碼在記憶體裡顯示字元,存到硬碟上都是2進製,所以編碼不對,程式就會出錯了。

(ascii編碼(美國),gbk編碼(中國),shift_jis編碼(日本),,,,)

要注意的是,存到硬碟上時是以何種編碼存的,再從硬碟上讀出來時,就必須以何種編碼讀,要不然就亂了。。

常見的編碼錯誤的原因有:

python直譯器的預設編碼

terminal使用的編碼

python原始檔檔案編碼

作業系統的語言設定,掌握了編碼之前的關係後,挨個排錯就ok

(3)如何進行編碼轉換?

如果想要中國的軟體可以正常的在美國人的電腦上實現,有下面兩種方法:

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,檔案處理、

(1) r和rb的區別是什麼?

檔案操作時候,以「r"或者」rb"模式開啟,只能讀取,無法寫入;

硬碟上儲存的檔案都是某種編碼的0101010,開啟時需要注意:

rb,直接讀取檔案儲存時原生的0101010,在python中用位元組型別表示

r和encoding,讀取硬碟的0101010,並按照encoding指定的編碼格式進行斷句,

再將「斷句」後的每一段0101010轉換成unicode的 010101010101,在python中用字串型別表示

(2)解釋一下下面三個引數的作用分別是什麼?

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()

Python 編碼練習題(1)

題目一 給定兩個數求餘數 給定的2個引數 num1 num2 比大小考慮情況 1.兩個數相等 num1 num2 直接判斷餘數為0 2.除數大於被除數 num13 除數不能為0 4 被除數大於除數 乘法迴圈計算比較 def quyu num1,num2 if num1 num2 print 餘數是0...

python 檔案練習題

練習一 建立檔案data.txt,檔案共100000行,每行存放乙個1 100之間 的整數,寫完後讀取檔案內容 import random f1 open home kiosk data.text w for i in range 100000 f1.write str random.randint...

python書中練習題 python練習題

1 定義乙個空列表,接收從鍵盤輸入的整數,把列表傳給乙個從大到小排序的函式,再輸出排序後的列表的值 listex b 0 a int input 請輸入列表長度 while b a num int input 請輸入字元 b 1 print listex sum 0 for i in range 0...