1. 程式人生 > 實用技巧 >053❤檔案的三種開啟模式

053❤檔案的三種開啟模式

一、概念介紹

1.1 讀寫模式

檔案操作的基礎模式有三種,預設的操作模式(也就是不指定模式時)為r模式:

  • r模式為read:只讀
  • w模式為write:只寫
  • a模式為append:追加

1.2 內容格式

檔案讀寫內容的格式有兩種(預設的讀寫內容的模式為b模式):

  • t模式為text:文字格式
  • b模式為bytes:位元組格式

需要注意的是:t、b這兩種模式均不能單獨使用,都需要與r/w/a之一連用

二、檔案的開啟模式之r模式

r: read,只讀模式,只能讀不能寫,檔案不存在時報錯。

f = open('32.txt', mode='r')  # 報錯
f.write()
f.close()


# rt: read by text
# windows的作業系統預設編碼為gbk,因此需要使用utf8編碼
f = open('32.txt', mode='rt', encoding='utf8')
data = f.read()
print(data)
print(f"type(data): {type(data)}")
f.close()

# aaa
# bbb
# ccc
# type(data): <class 'str'>


# rb: read by bytes
f = open('32.txt', mode='rb')
data = f.read()
print(data)
print(f"type(data): {type(data)}")
f.close()

#b'aaa\nbbb\nccc\nnick\xe6\x9c\x80\xe5\xb8\x85\xe5\x90\x97'
type(data): <class 'bytes'>

f.read()讀取完檔案後,檔案指標會跑到檔案的末端,如果再一次讀取,讀取的將是空。

f = open('32.txt', mode='rt', encoding='utf8')
data1 = f.read()
data2 = f.read()
print(f"data1: {data1}")
print(f"data2: {data2}")
f.close()

#data1: aaa
# bbb
# ccc
# data2: 

缺點:由於f.read()一次性讀取檔案的所有內容,如果檔案非常大的話,可能會造成記憶體爆掉,即電腦卡死。因此可以使用f.readline()/f.readlines()讀取檔案內容。

# f.readline()/f.readlines()
f = open('32.txt', mode='rt', encoding='utf8')
print(f"f.readable(): {f.readable()}")  # 判斷檔案是否可讀
data1 = f.readline()
data2 = f.readlines()
print(f"data1: {data1}")
print(f"data2: {data2}")
f.close()

# f.readable(): True
# data1: aaa
# data2: ['bbb\n', 'ccc\n']

三、檔案開啟模式之w模式

w: 只能寫,不能讀,檔案存在的時候回清空檔案後再寫入內容;檔案不存在的時候會建立檔案後寫入內容。

# wt
f = open('34w.txt', mode='wt', encoding='utf8')
print(f"f.readable(): {f.readable()}")
f.write('lwx 真帥呀\n')  # '\n'是換行符
f.write('lwx,lwx, you drop, I drop.')
f.write('lwx 帥的我五體投地')
f.flush()  # 立刻將檔案內容從記憶體刷到硬碟
f.close()

#f.readable(): False


# wb
f = open('34a.txt', mode='wb')
f.write('lwx 帥的我五體投地'.encode('unicode_escape'))  # 編碼成bytes型別
print(
    f"type('lwx 帥的我五體投地'.encode('unicode_escape')): {type('lwx 帥的我五體投地'.encode('unicode_escape'))}")
f.close()


#type('lwx 帥的我五體投地'.encode('unicode_escape')): <class 'bytes'>

四、檔案開啟模式之a模式

a: 可以追加。檔案存在,則在檔案的末端寫入內容;檔案不存在的時候會建立檔案後寫入內容

# at
f = open('34a.txt', mode='at', encoding='utf8')
print(f"f.readable(): {f.readable()}")
f.write('lwx 真帥呀\n')  # '\n'是換行符
f.write('lwx,lwx, you drop, I drop.')
f.write('lwx 帥的我五體投地')
f.close()

#f.readable(): False

五、檔案開啟讀取二進位制

try:
    import requests

    response = requests.get(
        'https://www.cnblogs.com/AShine/p/13517932.html')
    data = response.content

    f = open('mv.jpg?x-oss-process=style/watermark', 'wb')
    f.write(data)
    print('done...')
    f.close()
except Exception as e:
    print(e, '報錯了,那就算了吧,以後爬蟲處會詳細介紹')

#done...

f = open('34w.txt', 'wb')
f.write('lwx 好帥啊'.encode('utf8'))
f.close()