Python【第三篇】文件操做、字符編碼

1、文件操做

文件操做分爲三個步驟:文件打開、操做文件、關閉文件,可是,咱們能夠用with來管理文件操做,這樣就不須要手動來關閉文件。python

實現原理:程序員

import contextlib
@contextlib.contextmanager
def show():
    print('123')
    yield
    print('456')

with show():
    print('777')
    print('888')
    print('999')

操做步驟shell

#windows下默認爲gbk,要指定編碼爲'utf-8'
#'r'爲只讀,'test.txt'爲文件路徑
f=open('test.txt','r',encoding='utf-8')  #utf-8編碼方式打開文件
data=f.read()               #操做文件
f.close()                 #關閉文件
print(data)
 
# 用with語句打開,不須要手動關閉
with open('test.txt','r',encoding='utf-8') as f:
    print(f.read())

示例 windows

# r,只讀模式【默認,不存在則報錯】
# w,只寫模式【不可讀:不存在則建立;存在則清空內容】
# x,只寫模式【不可讀:不存在則建立,存在則報錯】
# a,追加模式【不可讀;不存在則建立;存在則只追加內容】
# "+"表示能夠同時讀寫某個文件,好比r+、w+、x+、a+
# "b"表示以字節的方式操做,rb或r+b,wb或w+b,xb或x+b,ab或a+b,
# 以b方式打開時,讀取到的內容是字節類型,寫入時也須要提供字節類型,這些都須要程序員來作轉換。
# f.tell()   讀取指針的位置
# f.seek()  設置指針的位置

# r只讀(不存在則報錯)
with open('test.txt', 'r', encoding='utf-8') as f:
    print(f.read())  # test.txt,不存在,報錯

# w只寫(不可讀,不存在建立,存在則清空)
with open('test.txt', 'w') as f:
    f.write('123')  # 建立test.txt 寫入新內容123

# x只寫(不可讀,不存在建立,存在報錯)
with open('test.txt', 'x') as f:
    f.write('666')  # 這裏存在,報錯

# a追加模式(不可讀,不存在建立,存在往末尾追加)
with open('test.txt', 'a') as f:
    f.write('111')  # 往test.txt裏面追加111

# 以字節方式打開,將test.txt裏面的文件內容清空,往裏面寫入'你們好',須要將內容轉換成bytes類型
with open('test.txt', 'wb') as f:
    str_data = '你們好'
    byte_data = str_data.encode('utf-8')
    f.write(byte_data)

# 以rb讀
with open('test.txt', 'rb') as f:
    data = f.read()
    print(data)  # b'\xe5\xa4\xa7\xe5\xae\xb6\xe5\xa5\xbd'
    print(type(data))  # 打印出讀取的類型<class 'bytes'>
    str_data = data.decode('utf-8')
    print(str_data)  # 你們好

# r+形式 寫的時候在末尾追加,指針移到到最後
with open('test.txt','r+',encoding='utf-8') as f:
    print(f.tell())  # 打印下 文件開始時候指針指向哪裏 這裏指向 0
    print(f.read())  # 讀出文件內容'你們好'
    print(f.tell())  # 文件指針指到 9,一個漢子三個字符串,指針是以字符爲單位
    f.write('我在學習')  # 寫入內容'我在學習',須要特別注意此時文件指針在末尾
    print(f.read())  # 指針到末尾去了,因此讀取的內容爲空
    print(f.tell())  # 指針指到15
    f.seek(0)  # 將指針內容指到 0 位置
    print(f.read()) # 由於文件指針指到開頭去了,因此能夠讀到內容 你們好我在學習

# w+形式 存在的話先清空 一寫的時候指針到最後
with open('test.txt', 'w+') as f:
    f.write('python')  # test.txt存在,因此將內面的內容清空,而後再寫入 'python'
    print(f.tell())  # 此時指針指向6
    print(f.read())  # 讀不到內容,由於指針指向末尾了
    f.seek(0)  # 移動指針到開頭
    print(f.read())  # 讀到內容

# a+打開的時候指針已經移到最後,寫的時候無論怎樣都往文件末尾追加
with open('test.txt', 'a+') as f:
    print(f.tell())
    f.write(' is best')
    print(f.read())  # 讀不到內容,由於指針指向末尾了
    f.seek(0)  # 移動指針到開頭
    print(f.read())  # 讀到內容

# x+文件存在的話則報錯
with open('test.txt', 'x+') as f:  # FileExistsError: [Errno 17] File exists: 'test.txt'
    print(f.tell())
    f.write(' hello')
    print(f.read())
    f.seek(0)
    print(f.read())  

同時操做多個文件學習

# 拷貝A文件到B文件中
with open('A.txt','r',encoding='utf-8') as fr,open('B.txt','w',encoding='utf-8') as fw:
    for line in fr:  # 一行行的讀
        fw.write(line)  # 一行行的寫

2、字符編碼

在python中,編碼是一個比較折騰的難點,特別是python2。優化

首先,瞭解下這幾種編碼:編碼

  ASCII(American Standard Code for Information Interchange,美國標準信息交換代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其餘西歐語言,其最多隻能用 8 位來表示(一個字節),即:2**8 = 256,因此,ASCII碼最多隻能表示 256 個符號,顯然ASCII碼沒法將世界上的各類文字和符號所有表示,因此,就須要新出一種能夠表明全部字符和符號的編碼,即:Unicodespa

  Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字符編碼。Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,規定雖有的字符和符號最少由 16 位來表示(2個字節),即:2 **16 = 65536,注:此處說的的是最少2個字節,可能更多 指針

  UTF-8,是對Unicode編碼的壓縮和優化,他再也不使用最少使用2個字節,而是將全部的字符和符號進行分類:ascii碼中的內容用1個字節保存、歐洲的字符用2個字節保存,東亞的字符用3個字節保存...code

在python3中,字符串編碼是unicode,默認文件編碼是utf-8(存在硬盤上的文件),因此能夠省略文件頭編碼聲明:#-*- coding:utf-8 -*-

讀取到內存會被python解釋器自動轉換成unicode

並且,全部的unicode字符編碼後都會變成bytes類型

可是若是是其餘文件編碼,如gbk,則須要聲明文件編碼:#-*- coding:gbk -*-,可是以gbk讀取到內存中後,依然會轉爲unicode

總之,以什麼編碼方式存在硬盤上(代碼字符串文件頭定義的編碼,好比:# -*- coding:utf8 -*-),就用什麼編碼方式從硬盤上讀,無論什麼編碼方式,python3都會將字符串在內存中轉爲unicode

py3自動把文件編碼轉爲unicode一定是調用了什麼方法,這個方法就是,decode(解碼) 和encode(編碼)

UTF-8 --> decode 解碼 --> Unicode

Unicode --> encode 編碼 --> GBK / UTF-8

#-*- coding:utf-8 -*-
import sys
print(sys.getdefaultencoding())  # utf-8
s = '你好'
print(s)  # 你好
print(type(s))  # <class 'str'>
print(s.encode())  # b'\xe4\xbd\xa0\xe5\xa5\xbd'
s_to_gbk = s.encode('gbk') # 編碼成gbk
print(s_to_gbk)  # b'\xc4\xe3\xba\xc3'
print(s_to_gbk.decode('gbk').encode('utf-8')) # gbk轉成utf-8,和上面s.encode()同樣,b'\xe4\xbd\xa0\xe5\xa5\xbd'

3、練習(加Q羣獲取參考答案)

1.實現簡單的shell sed替換功能

2.註冊

  註冊信息存放在文件中

3.模擬登錄

  連續登錄失敗三次,就鎖定用戶

相關文章
相關標籤/搜索