python—編碼,文件練習題

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()
相關文章
相關標籤/搜索