一、 文件操作流程
- 打开文件,得到文件的对象(句柄)
- 通过文件对象(句柄)操作文件
- 保存并关闭文件
二、 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. for 循环文件对象
>>> 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 # 文件是否关闭
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
答案
with open('/scripts/zuoye-rw.txt','r',encoding='utf-8') as f:
#读这个文件转换成列表,并以“-”为分隔符
content_li = f.read().split('-')
for line in content_li:
#取文件名 (split分割,默认以空格或者tab为分隔符)
file_name = line.split(';')[0].split('=')[1]
#(replace替换分隔符)
line = line.replace('=',':').replace(';','\n')
#把format后面括号的值或变量赋值给大括号
with open('{}.yaml'.format(file_name), 'w',encoding='utf-8') as wf:
wf.write(line)