Python對文件操作的流程
- 打開文件 得到文件句柄并賦值給一個變量
- 通過文件句柄對文件進行操作
- 關閉文件
關于關閉文件,Python解析器在寫入文件時會將寫入的內容放到內置的一個緩沖區中,在程序執行結束時會將緩沖區的數據寫入到文件中。所以我們最好在操作完文件后調用close方法關閉文件,及時讓改動生效
code
# 打開文件,得到文件句柄并賦值給一個變量
f = open('test', 'w', encoding='utf8')
# 操作文件
f.write('hello world')
# 關閉文件
f.close()
文件操作模式
- 在上面的文件操作中,創建操作對象的open方法中,會指定一個文件的打開模式w,Python還有其它的操作模式
r 讀取
w 寫入 打開寫作,先截寫文件 就是在打開文件后將文件的所有內容截斷再重新寫入文件內容
x 創建一個新的文件然后以寫入的方式打開
a 以寫入的方式打開,并且在文件的最后拼接內容
b 二進制
t text mode(文本模式 默認的)
- 打開一個磁盤文件,用于更新(讀取和寫入)
* r+ 讀寫模式 先讀后寫,會先將文件讀到然后寫到文件后面 光標起始位置在最開始
* w+ 寫讀模式 先寫后讀 會先以w打開文件就會情況文件全部的內容
* a+ 追加模式 (+可讀) 光標起始位置在最后
* + 加上+意味著同時為輸入和輸出打開文件
U 通用換行模式(棄用)
文件對象方法
- readlines() 返回整個文件內容的列表
- read()
- tell() 返回文件內部索引指針當前的位置。
- 其中 英文數字占一個字符,中文占3個字符,注意此刻讀出來的索引的位置和文件編碼沒有關系
- writelines(list) 把列表內所有字符串寫入文件中
f = open('test', 'r+')
print(f.tell())
# f.write('hello yourself it\'test ')
# time.sleep(100)
# f.close()
print(f.read(2))
print(f.tell())
f.tell()
- seek 設置內部索引指針的位置
- flush 把輸出緩沖區刷到硬盤中,但不關閉文件
- print(內容,結束,flush=True/False[是否即刻將緩沖區的內容刷新])
- truncate(count) count 默認 -1 截斷:截取文件的指定內容,默認從最開始的位置截取所有內容
- with
為了避免打開文件后忘記關閉,可通過with進行管理
with.open('log','r') as f:
pass
當with代碼執行完畢時候,內部會自動關閉并釋放文件資源
在Py2.7后,with又支持同時對多個文件進行管理
with open('log1') as obj1,open('log2') as obj2:
pass
- 格式
with open(filepath1) as file對象...:
pass
with open('test', 'r', encoding='utf8') as file_read, open('56789', 'w', encoding='utf8') \
as file_write:
number = 0
for read_line in file_read:
number += 1
if number == 3:
read_line = ''.join([read_line.strip(), '王鑫\t', 'is Speaking\n'])
file_write.write(read_line)
Python的文件支持
- Python支持文本和二進制文件
- 文本文件把內容表示為常規的str字符串,自動執行Unicode編碼和解碼,并且默認執行末行轉換
- 二進制文件把內容表示為一個特殊的bytes字符串類型,并且允許程序不修改地訪問文件內容
在文件中存儲并解析Python對象
- 文件數據在腳本中一定是字符串,而寫入方法不會自動地替我們做任何向字符串格式轉換的工作
X, Y, Z = 30, 25, 33
S = 'Span'
D = {'a': 1, 'b': 2}
L = {1, 2, 3}
F = open('writeFile.txt', 'w', encoding='utf8')
F.write(S + '\n')
F.write("%s,%s,%s\n" % (X, Y, Z))
F.write(str(L) + '$' + str(D) + '\n')
F.close()
- Python不會自動把字符串轉換為數字或者其他類型的對象
eval函數
- eval是Python內置函數,eval能夠把字符串當做可執行程序代碼
# D = {'a': 1, 'b': 2}
# L = {1, 2, 3}
# F.write(str(L) + '$' + str(D) + '\n')
direc_file = readF.readline()
direc_splite = direc_file.split('$')
directs = [eval(P) for P in direc_splite]
print(directs)
# [{1, 2, 3}, {'a': 1, 'b': 2}]
用pickle 存儲Python原生對象
- Pickle模塊是能夠讓我們直接在文件中存儲幾乎任何Python對象的高級工具
import pickle
# 寫入字典到文件
direct_a = {'a': 1, 'b': 2, 'c': 3}
F = open('pickleFile.txt', 'wb')
pickle.dump(direct_a, F)
F.close()
# 從文件取回字典
read_file = open('pickleFile.txt','rb')
direct_b = pickle.load(read_file)
print(direct_b)
# 輸出
# {'a': 1, 'b': 2, 'c': 3}
- pickle在內部將字典轉成字符串形式
- 在Python3.0 中 pickle化的對象的文件總是二進制的。因為pickle程序創建和使用一個bytes字符串對象。