一、 文件操作流程
- 打開文件,得到文件的對象(句柄)
- 通過文件對象(句柄)操作文件
- 保存并關(guān)閉文件
二、 Python 中如何實現(xiàn)
在 python中使用open() 函數(shù)來操作文件。
- 打開文件,得到文件句柄,并把一個變量名分配給這個文件句柄
變量名 = open('文件路徑', '打開模式', encoding = '字符編碼')
f_obj = open('a.txt', 'r', encoding='utf-8')
- 通過句柄對文件進(jìn)行操作
data = f_obj.read()
print(data)
- 關(guān)閉文件
f_obj.close()
字符編碼的問題
f=open(...)是由操作系統(tǒng)打開文件,那么如果我們沒有指定編碼,那么打開文件的默認(rèn)編碼很明顯是操作系統(tǒng)說了算,操作系統(tǒng)會用自己的默認(rèn)編碼去打開文件,默認(rèn)情況下,在windows下是gbk,在linux下是utf-8。若要保證不亂碼,文件以什么方式存儲的,就要以什么方式打開。
三、 文件打開模式
打開文件的模式有:
1. 文本方式操作
-
r只讀模式【默認(rèn)】 -
w只寫模式【不可讀;不存在則創(chuàng)建;存在則清空原來的內(nèi)容再寫新內(nèi)容;】 -
a追加模式【不可讀;不存在則創(chuàng)建;存在則以追加的方式寫入新的內(nèi)容;】
2. 字節(jié)方式操作
b 表示以字節(jié)的方式操作,不需要編碼的參數(shù) encoding
-
rb字節(jié)方式讀取 -
wb字節(jié)方式寫入,清空原文件內(nèi)容 -
ab字節(jié)方式的追加寫入
注意:以
b方式打開時,讀取到的內(nèi)容是字節(jié)類型,寫入時也需要提供字節(jié)類型
四、文件操作
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()
# 一次讀完,把每一行的內(nèi)容放在列表中,成為列表中的一個元素
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 內(nèi)容
f_obj = open('b.txt', 'wb')
# 定義 bytes 內(nèi)容, 兩種方式都可以
b1 = bytes('你好\n', encoding='utf-8')
b2 = '廣州\n'.encode('utf-8')
# 可以用 writelines() 一次性寫入多行
f_obj.writelines([b1, b2])
f_obj.close()
3. for 循環(huán)文件對象
>>> file_name = './a.txt'
>>> f_obj = open(file_name, 'r')
>>> for line in f_obj:
... print(line)
...
hello
world
>>>f_obj.close()
In [10]: f = open('a.txt', 'w', encoding='utf-8')
In [11]: for i in ['name', 'shark']:
...: print(i)
...:
name
shark
In [12]: for i in ['name', 'shark']:
...: f.write("{}\n".format(i))
...:
In [13]: f.close()
In [14]: !cat a.txt
name
shark
4. 其他方法和屬性
f.name # 文件名
f.closed # 文件是否關(guān)閉
f.readable() # 文件是否可讀
f.writable() # 文件是否可寫
f.flush() # 立刻將文件內(nèi)容從內(nèi)存刷到硬盤
源數(shù)據(jù)
觀察下面的數(shù)據(jù),完成下面的需求。
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
# 你只需要復(fù)制上面的一行數(shù)據(jù)即可,千萬不要復(fù)制此行以及下面的一行
#
需求:
注意上面的源數(shù)據(jù)是分為好幾個部分的。把每個部分分別寫在每個文件中。
每個部分的文件名稱為symbol鍵對應(yīng)的值。
比如上面示例中,文件名應(yīng)該是:BCHBTC, 并且每個文件的擴(kuò)展名均為:.yml結(jié)尾。
示例結(jié)果:
文件名: BCHBTC.yaml 部分內(nèi)容如下symbol: BCHBTC baseCoin: BCH文件名: QTUMUSDT.yaml 部分內(nèi)容如下
symbol: QTUMUSDT baseCoin: QTUM