文件处理
Posted 帅气的小虎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件处理相关的知识,希望对你有一定的参考价值。
文件操作
文件
1操作系统
windows mac Linux
双击文件
硬盘转 磁头读取数据
保存文件
硬盘转 磁头写入数据
我们在操作文件的时候操作的其实是硬盘
\'\'\'文件其实是操作系统暴露给我们可以简单快捷的操作硬盘的接口
python操作文件的方法
绝对路径:非常详细的路径描述,无论是谁都可以找到
相对路径:
open()关键字
.read()关键字
打开文件方法
1, open(\'a,txt\',mode=\'r\')
2, with open(r\'a.txt\',\'r\',encoding=\'utf-8\')as f:
print(f.read)
子代码运行结束之后会自动调用close关闭文件
with open (文件路径,读写模式,编码格式) as 变量名
子代码块
文件路径是必须的 读写模式和编码格式是可选的
如果不指定读写模式,name默认使用r
如果不使用编码格式默认使用gbk
应用程序==========f=文件
操作系统==========
硬盘
换行操作 /
重点
文件的打开模式
控制文件操作的系统
r:(默认)读
w: 写
a 追写
控制文件读写的模式 其中t和b 不能单独使用
t : (默认模式)读写都是以字符串为单位,必须指定encoding参数
b: 读写都是以bytes为单位,只适应与所有文件,一定不能指定encoding参数
rt模式 : 只读模式,如果文件不存在则报错,文件指针在文件的开头位置
f=open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\')
res=f.read
f.close(关闭文件)
wt模式:(慎重使用)只写模式,如果文件不存在,则重新创建空文本文件,如果存在,则清空文件,指针处于开头
f=open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\')
f.write()写入关键字
编写程序换行符\\n 由自己指定
wt模式下,在打开了文件不关的情况下,连续的write写入,新写的内容跟在后面。
at模式 只写模式 ,追加写,文件不存在,则创建,文件存在不会清空,指针在尾部
f=open(\'a.txt\',mode=\'ra\',encoding=\'utf-8\'
rb + wb 读写 重建 复制
文件拷贝功能
with open(\'1.mp4\',mode=\'rb\') as f1,open(r\'D:\\ceshi1.mp4\',mode=\'wb\') as f2:
如果文件过大 请使用for 循环单行读取
文件操作其他方法
1,读操作
f.read读取所有的内容,执行完该操作后,文件指针会移动到文件末尾
f.readline()读取每一行内容,光标移动到第二行首部
f.readlines()读取每一行的内容,存放于列表中
强调: f.read和f.readline都是一次性读取内容,如果内容过大会导致内存溢出,如果还想将内容提取到内存,请使用多次读入,方法如下
with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
for line in f:
print(line)
with open(\'1.mp4\',mode=\'rb\') as f:
while True:
data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中
if len(data) == 0:
break
print(data)
写操作
f.write(\'11111\\n222\\n\')针对文模式的写,需要自己写换行符
f.write(\'111\\n222\\n\'.encode(\'utf-8\'))针对b模式的写,需要自己转换行符,并且必须用utf-8进行字符转换
f.writelines([\'333\\n\',\'444\\n\']) # 文件模式
f.writelines([bytes(\'333\\n\',encoding=\'utf-8\'),\'444\\n\'.encode(\'utf-8\')]) #b模式
控文件内的指针移动
前提:文件内指针的移动都是以bytes为单位,唯一例外的是t模式下的read(n),n是以字符为单位
with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\')as f:
data= f.read(3) 读取三个字符
with open(\'a.txt\',mode=\'rb\')as f:
data= f.(read(3)) 读取三个Bytes
之前 文件指针的移动都是有读、写操作控制而被动触发的,弱项读取文件的某一特殊位置,需要用的f.seek方法,主动控制文件内指针的移动,方法如下
f.seek(指针移动的字节数,模式控制):
模式控制:
0模式 默认的模式,该模式代表指针移动的字节数以文件的开头为参照的
1模式 该模式代表指针移动的字节数是以当前位置为参照的
2模式该模式代表指针移动的字节数是以文件的末尾为参照
强调:其中的0模式可以在 t 或者 b 模式使用 而1 和2 模式只能在b 模式下使用
0模式下的使用
00with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
f.seek(3,0) # 参照文件开头移动了3个字节
print(f.tell()) # 查看当前文件指针距离文件开头的位置,输出结果为3
print(f.read()) # 从第3个字节的位置读到文件末尾,输出结果为:你好
# 注意:由于在t模式下,会将读取的内容自动解码,所以必须保证读取的内容是一个完整中文数据,否则解码失败
with open(\'a.txt\',mode=\'rb\') as f:
f.seek(6,0)
print(f.read().decode(\'utf-8\')) #输出结果为: 好
1模式下的使用
# 1模式的使用
with open(\'a.txt\',mode=\'rb\') as f:
f.seek(3,1) # 从当前位置往后移动3个字节,而此时的当前位置就是文件开头
print(f.tell()) # 输出结果为:3
f.seek(4,1) # 从当前位置往后移动4个字节,而此时的当前位置为3
print(f.tell()) # 输出结果为:7
2模式的使用
import time
with open(\'access.log\',mode=\'rb\')as f:
f.seek(0,2)
while 1 :
line= f.readline()
文件修改
# 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
with open(\'db.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
data=f.read()
with open(\'db.txt\',mode=\'wt\',encoding=\'utf-8\') as f:
f.write(data.replace(\'kevin\',\'SB\'))
# 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os
with open(\'db.txt\',mode=\'rt\',encoding=\'utf-8\') as read_f,\\
open(\'.db.txt.swap\',mode=\'wt\',encoding=\'utf-8\') as wrife_f:
for line in read_f:
wrife_f.write(line.replace(\'SB\',\'kevin\'))
os.remove(\'db.txt\')
以上是关于文件处理的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段
你如何在 python 中处理 graphql 查询和片段?