文件处理
# 1. 文件处理流程
- 打开文件,得到文件句柄并赋值给一个变量
- 通过句柄对文件进行操作
- 关闭文件
# 2. 基本操作
文件句柄 = open('文件路径',‘模式’)
f=open(‘文件’,’r’) #以r读模式打开一个文件
f.close() #关闭文件,相当于保存
1
2
2
# 2.1 上下文管理
#第一种方法
with open('a.txt','w') as f:
pass
#第二种方法
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data=read_f.read()
write_f.write(data)
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2.2 文件的修改
import os
with open('a.txt','r',encoding='utf-8') as read_f,\
open('a.txt.swap','w',encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line)
os.remove('a.txt')
os.rename('.a.txt.swap','a.txt')
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2.3 文件处理模式
- r 文本模式的读,如果文件不存在,不会创建新文件,会抛出异常
- w 文本模式的写,文件存在则清空,不存在则创建
- a 文本模式的追加,文件存在光标跳到文件末尾,文件不存在创建
- rb 即直接从硬盘中读取bytes
- wb 以bytes写模式打开
- ab 以bytes追加模式打开
- r+ 读的时候可写
- w+ 写的时候可读
- a+ 追加时可读写
# 只读模式
f=open(r'c.txt',encoding='utf-8')
print('====>1',f.read())
print('====>2',f.read())
print(f.readable())
print(f.readline(),end='')
print(f.readline())
print("="*20)
print(f.read())
print(f.readlines())
f.close()
#写模式:文件不存在则创建,文件存在则覆盖原有的
f=open("new.py",'w',encoding='utf-8')
f.write('1111111111\n')
f.writelines(['2222\n','2222548\n','978646\n']) #一次写入多行
f.close()
# 追加模式:文件不存在则创建,文件存在不会覆盖,写内容是追加的方式写
f=open('new.py','a',encoding='utf-8')
f.write('nishishui\n')
f.writelines(['aa\n','bb\n'])
f.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 2.4 文件内光标移动
**f.read() **
一次性读取文本中全部的内容,以字符串的形式返回结果
f.read(3)
1
文件打开方式为文本模式时,代表读取3个字符;
文件打开方式为b模式时,代表读取3个字节;
unicode格式中3个字节=1个字符
**f.seek() **
控制光标移动几个字节
seek有三种模式: 0 从首字节开始 1 b模式下运行,以当前光标所在的位置为参照物 2 b模式下运行,以最后一个字节为参照物
1
2
3
4
练习:模拟tail –faccess.log
# python3 tail.py -f access.log
import time
import sys
with open(r'%s' % sys.argv[2], 'rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if line:
print(line.decode('utf-8'),end='')
else:
time.sleep(0.2)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
truncate()
文件的打开方式为可写,从文件开头开始截取,留下指定字节之后的字节
f.readline()
只读取文本第一行的内容,以字符串的形式返回结果
f.readlines()
读取文本所有内容,并且以数列的格式返回结果,一般配合for in使用
f.readble()
判断文件是否有读的权限,返回布尔值
f.tell()
查看光标位置
练习:cp文件的python小脚本
import sys
#python3 copy.py source.file target.file
if len(sys.argv) < 3:
print('Usage:python3 copy.py source.file target.file')
sys.exit()
#r'C:\Users\Administrator\PycharmProjects\python18期周末班\day3\test.jpg'
with open(r'%s' %sys.argv[1],'rb') as read_f,\
open(r'%s' %sys.argv[2],'wb') as write_f:
for line in read_f:
write_f.write(line)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 3. 字符编码
在文件处理过程中,首先有一个重要的概念,就是字符编码
**字符编码:**把人类的字符编译成计算机能认识的数字
**字符编码表:**就是一张字符与数字对应关系的表
- ascii
- gbk
- utf-8 (硬盘中常用编码)
- unicode (内存中常用编码)
字符编码转码
- Unicode ----> encode(‘utf-8’) 编码 ----> bytes
- bytes ----> decode(‘utf-8’)解码 ----> Unicode
原则:字符以什么格式编译的,就要以什么格式解码
python3中的字符串分为两种
x='egon' #默认存为unicode
y=x.encode('utf-8') #使用encode编码为bytes
1
2
2
python2中字符串也分为两种
x=u'egon' #加u表示存为Unicode格式,与python3的字符串一样
y='alex' #默认存为bytes
1
2
2
上次更新: 2023/07/04, 15:10:38