一、 文件操作流程
- 打開文件,得到文件的對象(句柄)
- 通過文件對象(句柄)操作文件
- 保存並關閉文件
二、 Python 中如何實現
在 python
中使用open()
函數來操作文件。
- 打開文件,得到文件句柄,並把一個變量名分配給這個文件句柄
變量名 = open('文件路徑', '打開模式', encoding = '字符編碼')
f_obj = open('a.txt', 'r', encoding='utf-8')
- 通過句柄對文件進行操作
data = f_obj.read()
print(data)
- 關閉文件
f_obj.close()
字符編碼的問題
f=open(...)
是由操作系統打開文件,那麼如果我們沒有指定編碼,那麼打開文件的默認編碼很明顯是操作系統說了算,操作系統會用自己的默認編碼去打開文件,默認情況下,在windows
下是gbk
,在linux
下是utf-8
。若要保證不亂碼,文件以什麼方式存儲的,就要以什麼方式打開。
三、 文件打開模式
打開文件的模式有:
1. 文本方式操作
-
r
只讀模式【默認】 -
w
只寫模式【不可讀;不存在則創建;存在則清空原來的內容再寫新內容;】 -
a
追加模式【不可讀;不存在則創建;存在則以追加的方式寫入新的內容;】
2. 字節方式操作
b
表示以字節的方式操作,不需要編碼的參數 encoding
-
rb
字節方式讀取 -
wb
字節方式寫入,清空原文件內容 -
ab
字節方式的追加寫入
注意:以
b
方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型
四、文件操作
1. 讀操作
f_obj = open('./a.txt', 'r')
# 讀全部
content = f_obj.read()
print(content)
# 每次讀一行
line1 = f_obj.readline()
line2 = f_obj.readline()
line3 = f_obj.readline()
# 一次讀完,把每一行的內容放在列表中,成爲列表中的一個元素
line_list = f_obj.readlines()
2. 寫操作
a. 寫普通的文本
f_obj = open('a.txt', 'w')
# 針對文本模式的寫,需要自己寫換行符
f_obj.write('楊哥\n')
f_obj.write('千鋒\n')
f_obj.close()
b. 寫 bytes
內容
f_obj = open('b.txt', 'wb')
# 定義 bytes 內容, 兩種方式都可以
b1 = bytes('千鋒\n', encoding='utf-8')
b2 = '楊哥\n'.encode('utf-8')
# 可以用 writelines() 一次性寫入多行
f_obj.writelines([b1, b2])
f_obj.close()
3. 其他方法和屬性
f.name # 文件名
f.closed # 文件是否關閉
f.readable() # 文件是否可讀
f.writable() # 文件是否可寫
f.flush() # 立刻將文件內容從內存刷到硬盤
作業
源數據
觀察下面的數據,完成下面的需求。
symbol=BCHBTC;baseCoin=BCH;quoteCoin=BTC;baseAccountNormal=201104;baseAccountLock=202104;quoteAccountNormal=201101;quoteAccountLock=202101;sysUid=1;sysBaseAccount=101015;sysQuoteAccount=101016;feeCoin=YLB;useFeeCoin=false;feeAccountNormal=201109;sysFeeAccount=101025;useFeeByAward=false;feeAccountAward=206109-symbol=QTUMUSDT;baseCoin=QTUM;quoteCoin=USDT;baseAccountNormal=201143;baseAccountLock=202143;quoteAccountNormal=201106;quoteAccountLock=202106;sysUid=1;sysBaseAccount=101360;sysQuoteAccount=101361;feeCoin=YLB;useFeeCoin=false;feeAccountNormal=201109;sysFeeAccount=101362;useFeeByAward=false;feeAccountAward=206109-symbol=BCHUSDT;baseCoin=BCH;quoteCoin=USDT;baseAccountNormal=201104;baseAccountLock=202104;quoteAccountNormal=201106;quoteAccountLock=202106;sysUid=1;sysBaseAccount=101015;sysQuoteAccount=101016;feeCoin=YLB;useFeeCoin=false;feeAccountNormal=201109;sysFeeAccount=101025;useFeeByAward=false;feeAccountAward=206109-symbol=BOTBTC;baseCoin=BOT;quoteCoin=BTC;baseAccountNormal=201145;baseAccountLock=202145;quoteAccountNormal=201101;quoteAccountLock=202101;sysUid=1;sysBaseAccount=101121;sysQuoteAccount=101122;feeCoin=YLB;useFeeCoin=false;feeAccountNormal=201109;sysFeeAccount=101123;useFeeByAward=false;feeAccountAward=206109-symbol=ETHBTC;baseCoin=ETH;quoteCoin=BTC;baseAccountNormal=201102;baseAccountLock=202102;quoteAccountNormal=201101;quoteAccountLock=202101;sysUid=1;sysBaseAccount=101011;sysQuoteAccount=101012;feeCoin=YLB;useFeeCoin=false;feeAccountNormal=201109;sysFeeAccount=101023;useFeeByAward=false;feeAccountAward=206109
# 你只需要複製上面的一行數據即可,千萬不要複製此行以及下面的一行
#
需求:
注意上面的源數據是分爲好幾個部分的。把每個部分分別寫在每個文件中。
每個部分的文件名稱爲symbol
鍵對應的值。
比如上面示例中,文件名應該是:BCHBTC
, 並且每個文件的擴展名均爲:.yml
結尾。
示例結果:
文件名: BCHBTC.yaml 部分內容如下symbol: BCHBTC baseCoin: BCH
文件名: QTUMUSDT.yaml 部分內容如下
symbol: QTUMUSDT baseCoin: QTUM