Python文件基本操作详注
Python文件操作1.以指定的方式,
打开文件:open报错2.以指定方式,
读取文件:read readline等read函数按行读取遍历文件指针对象:最简单的按照行读取的方法
3.以指定方式,
写入文件:write/writelines4.tell函数返回当前文件指针在文件中的位置5.seek函数定位文件指针6.flush函数立即写入文件7.关闭文件的规范操作with语句的优化作用:
案例1.拷贝文件2.移除文件中的病毒代码
Python文件操作
1.以指定的方式, 打开文件:open
fp
= open("xxx.txt",'w',encoding
="utf-8")
fp
.write
("中国")
fp
.close
fp = open("xxx.txt",'w',encoding="utf-8")
只有open("xxx.txt")时,目的是获取文件句柄,如果没有该文件将会自动创建“xxx.txt”文件(无关打开之后的操作类型)
但是:如果使用r,没有未找到改文件名,将会报错:FileNotFoundError: [Errno 2] No such file or directory: 'xxxx.txt'
w,a不会出现这种情况,它们会直接创建文件
只有open("xxx.txt",'w')Python2默认是UTF-8编码,但是Python3将会根据系统(WINDOWS,MAC,LINUX)编码方式(中文简体是GBK)进行编码
utf-8与Unicode的区别主要区别在于:Unicode为世界上所有字符都分配了一个唯一的数字编号,UTF-8是Unicode编码的一种实现
r:读
w:写
a:追加
r+:读写方式打开文件
特征案例:
原文档为“汪帅是个”写入“老毛”结果:“老毛是个”
也就是指针从文档开始部分写入文件
w+:读写方式打开文件
与w操作相同。
但是,特征案例中:
fp = open("xxx.txt",'w+')步骤总是先使用“xxx.txt”替换原始文件,然后再写入也就是说fp = open("xxx.txt",'w+')后面紧跟着fp.read(),也只能读出空字符
因此,使用W+是一种方式,先写再读
但是,这时候要读的话,文件指针在文件最末尾还是读取的空字符
因此,必须把文件指针,移动到自己想要的位置处
例如,移动到最前面:fp.seek(0,0)
a+:追加和读的方式
fp
= open('xxxx.txt','a+')
fp
.write
('\n'+"中国"*2)
str = fp
.read
()
print(str)
fp
.close
()
文件指针一样,这时候读取的是空字符
报错
Unicode编解码问题详解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YOpqAKeJ-1570455739106)(C:\Users\蚩尤克里里\AppData\Roaming\Typora\typora-user-images\1570444538053.png)]
fp
= open('xxx.txt','rb')
str = fp
.read
()
print(str.decode
('utf-8'))
fp
.close
()
2.以指定方式,读取文件:read readline等
read函数
默认:全部读取指定字节:read(5)即为读取前五个字节
按行读取
每次读取一行:readline()
任务:使用readline遍历文件中所有的行数据
注意:无法使用for循环的,只能采用while循环
while True:
line
= fp
.readline
()
if not line
:
break
print(line
)
按行的形式将所有文件读取完:readlines()
此时:可以用for循环遍历fp.readlines()
遍历文件指针对象:最简单的按照行读取的方法
fp
= open(fname
,'r')
for line
in fp
:
print(line
)
fp
.close
fp作为文件指针
实质是一个迭代器,因此在for循环中可以不断迭代
3.以指定方式,写入文件:write/writelines
fp
.writelines
(['a','c','b'])
注意writeline不会换行
write函数只能写入字符串
TypeError: write() argument must be str, not list
writelines函数参数能写入数组
4.tell函数返回当前文件指针在文件中的位置
fp.tell()
5.seek函数定位文件指针
seek
(offset
,from)
6.flush函数立即写入文件
fp.flush()
7.关闭文件的规范操作
文件读取接着写入应该用“try……except……finally……”包围起来,以免数据丢失
try:
fp
= open('fname','r+')
fp
.read
()
fp
.write
()
except:
print('Error')
finally:
f
.close
()
使用with语句优化文件操作:
with open('fname','r+') as fp
:
fp
.read
()
fp
.write
()
with语句的优化作用:
无需写try……except……finally……相当于fp = open('fname','r+')不仅仅是针对文件的打开关闭操作实质是上下文管理器:是一种支持 __enter__和 __exit__这两个方法的对象
案例
1.拷贝文件
fname
= "【问题】十万个为什么记录本"
lines
= []
with open(fname
+".txt",'r',encoding
='utf-8') as fp
:
for line
in fp
:
lines
.append
(line
)
with open(fname
+"Copy.txt",'w') as fp1
:
fp1
.writelines
(lines
)
Error1:for line in fp:line是字符串(本质是指针对象)Error2:lines = []是数组,lines.append(line)
我犯的错误是:lines = fp.append(line)逻辑不通!!!
fname
= "【问题】十万个为什么记录本"
with open(fname
+".txt",'r',encoding
='utf-8') as fp
:
with open(fname
+"Copy.txt",'w') as fp1
:
for line
in fp
:
fp1
.write
(line
)
2.移除文件中的病毒代码
lines
= []
for line
in fp
:
if line
.startswith
("<script ……………………>"):
is_virus
= True
elif line
.startswith
("<script>"):
is_virus
= False
else:
if not is_virus
:
lines
.append
(line
)
startswith()函数else: if not is_virus: lines.append(line)上述代码块,很好的忽视了病毒代码