Python的文件操作
Posted 吃了好多肉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的文件操作相关的知识,希望对你有一定的参考价值。
假如利用Python代码写一个很low的软件,去操作文件:
-
需要的参数:
- 文件路径:path
- 打开方式:读,写,追加,读写,写读。。。
- 编码:utf-8,gbk,Unicode,big5。。。
例: f1 = open(‘F:测试.txt‘,mode=‘r‘,encoding=‘utf-8‘,) content = f1.read() print(content) f1.close()
-
open():内置函数,open底层调用的是操作系统的接口
-
f1:变量名,例:fh,file_header,f_h,文件句柄,对文件进行的任何操作,都得通过文件句柄
-
encoding:可以不写,不写则默认为系统的默认编码
- Windows:默认为gbk
- Linux:utf-8
- Mac:utf-8
-
mode:定义操作方式,r为读模式
-
f1.close():关闭文件句柄,若不关闭会一直占用内存空间
文件操作三部曲:
- 1、打开文件
- 2、对文件句柄进行相应操作
- 3、关闭文件
# 常见报错原因:
UnicodeDecodeError
# 文件存储时与文件打开是编码类型不一致
No such file or directory
# 文件路径或文件名错误。路径分隔符被解释器误认为特殊含义的字符,可以再次转义,或在路径整体前面加上r
文件操作的读:
- r:读,rb:读取非文本文件,r+:读写,r+b:以bytes类型读写
read():读取文件全部
read(n):按照字符串读取
readline():每次只读取一行,读取出来的每行后面都有一个换行符
,可以在读取的后面加一个strip()
readlines():返回一个列表,列表里的元素是源文件的每一行,如果文件很大,会占大量内存
# for循环读取:(推荐)
# 文件句柄是一个迭代器,特点就是每次循环只在内存中占一行数据,非常节省内存
# 例:
f1 = open(‘F:测试.txt‘,mode=‘r‘,encoding=‘utf-8‘)
for content in f1:
print(content)
f1.close()
-
rb模式:以二进制格式打开一个文件用于只读。主要操作非文本文件,
-
带b的模式操作文件,不用声明编码方式。读取后的文件类型为bytes类型
# 例: fi = open(r‘source‘,mode=‘rb‘) coutent = fi.read() print(coutent) fi.close()
-
文件操作的写:
- w:(写)wb:(操作非文本文件),w+:(写读),w+b:(以bytes类型进行写读)
- 文件不存在则新建,文件存在则先清空源文件内容,再写入新内容
f = open(‘文件的路径‘,encoding=‘utf-8‘,mode=‘w‘)
# 未指定路径则为当前路径
f.write(‘写入的内容,只能有这一个参数‘)
f.close()
-
wb:
# 例:先以bytes类型读取图片,再将读取出来的内容全部写入另一个文件,这样就复制了一份图片 fi = open(r‘source‘,mode=‘rb‘) coutent = fi.read() fi.close() f1 = open(‘new‘,mode=‘wb‘) f1.write(coutent) f1.close()
文件操作的追加:
-
a,ab,a+:追加并可读,a+b
-
没有文件则创建文件,追加内容。文件存在则原文件最后直接追加。
f = open(‘fiel‘,encoding=‘utf-8‘,mode=‘a‘)
f.write(‘追加的内容‘)
f.close()
文件操作的其他模式:
- r+:读并追加
# 例:
f = open(‘F:测试.txt‘,mode=‘r+‘,encoding=‘utf-8‘)
content = f.read()
print(content)
f.write(‘写入的内容‘)
f.close()
# 注意:操作文件时,要注意光标位置,例如写读操作,写操作完光标会在末尾,所以无法读出写入的内容
可在read()之前,利用seek(0)将光标移动到首部。
文件操作其他功能:
-
总结:
-
三个大方向,四种模式:
-
读:r,rb,r+,r+b
-
写:w,wb,w+,w+b
-
追加:a,ab,a+,a+b
-
-
-
相应的功能:
-
read(n):
- 1、文件打开为文本模式时,代表读取n个字符
- 2、文件打开为b模式时,代表读取n个字节
-
seek():
- seek(n):光标移到n位置,移动单位是字节byte,如果是utf-8编码,中文部分需要是3的倍数
- seek(0):移动到开头
- seek(0,2):seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1代表当前位置,2表示结尾
-
tell():
- 获取当前光标的位置,单位是字节。
-
flush():强制刷新。接在write()后面,可在写入之后强制保存。
-
?
打开文件的另一种方式:
-
语句 with open() as f:
-
优点1:不用手动关闭,with上下文管理会在一段时间后自动关闭文件句柄。
with open(r‘F:测试.txt‘,mode=‘r‘,encoding=‘utf-8‘) as f1: print(f1.read())
-
-
优点2:一个with语句可以操作多个文件,产生多个文件句柄。
with open(r‘F:测试.txt‘,mode=‘r‘,encoding=‘utf-8‘) as f1, open(‘filename‘,mode=‘w‘,encoding=‘utf-8‘) as f2 :
f1.read()
f2.write(‘content‘)
?
-
注意:with打开文件在一段时间后会自动关闭句柄,但这个时间不固定。
-
如果你在with语句中以r模式打开f1文件,那么你在下面又以a模式打开f1文件,此时有可能你第二次打开f1文件时,第一次的文件句柄还没有关闭,可能会出现错误。
-
解决方式只能在你第二次打开此文件前,手动关闭上一个文件句柄。
文件的修改:
-
所有的软件对文件的修改都分为5步:
-
1、以读的模式打开文件。
-
2、以写的模式创建一个新的文件。
-
3、将原文件的内容读出来修改成新的内容、写入新文件。
-
4、将原文件在内存级别删除。
-
5、将新文件重命名成原文件。
-
-
方式一:
-
1、以读的模式打开文件。
with open(r‘F: 1.txt‘,encoding=‘utf-8‘) as f1, open(r‘F: 2.txt‘,encoding=‘utf-8‘,mode=‘w‘) as f2: # 2、以写的模式创建一个新文件
- 3、将原文件内容全部读出到内存修改成新内容、写入新文件。(占用大量内存空间)
?
old_content = f1.read()
new_content = old_content.replace(‘葫芦‘,‘丝瓜‘)
f2.write(new_content)
- 4、将原文件在内存级别删除。
import os # 需要用到 os 模块
os.remove(r‘F: 1.txt‘)
- 5、将新文件重命名成原文件。
os.rename(r‘F: 2.txt‘,r‘F: 1.txt‘)
-
方式二
-
1、以读的模式打开文件。
with open(r‘F: 1.txt‘,encoding=‘utf-8‘) as f1, open(r‘F: 2.txt‘,encoding=‘utf-8‘,mode=‘w‘) as f2: # 2、以写的模式创建一个新文件
- 3、将原文件内容逐行读到内存修改成新内容、写入新文件。(占用大量硬盘空间)
for line in f1:
new_line = line.replace(‘丝瓜‘,‘葫芦‘)
f2.write(new_line)
4、将原文件在内存级别删除。
import os
os.remove(r‘F: 1.txt‘)
5、将新文件重命名成原文件。
os.rename(r‘F: 2.txt‘,r‘F: 1.txt‘)
注意:w模式中,文件句柄若没有关闭,可以多次写入而不会清空上一次写入的内容。
?
以上是关于Python的文件操作的主要内容,如果未能解决你的问题,请参考以下文章