Day 09 文件处理
Posted 北冷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day 09 文件处理相关的知识,希望对你有一定的参考价值。
文件处理
文件操作
概念
什么是文件?
文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能
为什么有文件?
读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作
基本流程
文件操作的流程:
- 打开文件,得到文件句柄并赋值给一个变量
2. 通过句柄对文件进行操作
3. 关闭文件
# 1. 打开文件a.txt,由应用程序向操作系统发起系统调用open(...),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
f=open(r\'a.txt\',\'r\',encoding=\'utf-8\')
# 2. 调用文件对象下的读/写方法,会被操作系统转换为读/写硬盘的操作
data=f.read()
print(data) # 读出啊a.txt里的内容
# 3. 向操作系统发起关闭文件的请求,回收系统资源
f.close()
操作完一个文件后一定要记住关闭!
r’a.txt中的r:
r 取消转义,涉及到路径都会用到
补充:
绝对路径
非常详细的路径描述,无论什么人什么位置都可以找到
如果文件的路径比较复杂,可用
相对路径
有一个参考,只有对应的人才可以找到
如果文件和操作系统属同一文件夹可用
文件打开的最佳操作
格式: with open(文件路径,读写模式,编码格式) as 变量名:
**子代码块 **
打开a.txt 使用变量名f指代改文件
with open(r\'a.txt\',\'r\',encoding=\'utf8\') as f:
print(f.read()) # 读取文件内容
with子代码运行结束之后会自动调用close关闭文件资源
# """
# 文件路径是必须的
# 读写模式和编码格式是可选的
# 如果不指定读写模式 那么默认使用r
# 如果不指定编码格式 那么默认使用当前计算机内部默认编码
# 在中国所有的windows电脑内部默认的编码是gbk
# """
文件的打开模式
文件的打开模式
r: (默认)只读模式,文件不存在则会报错,文件存在则文件指针处于文件开头
eg.
f = open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\')
print(f.read())
print(f.readable()) # True
print(f.writable()) # Flase
f.close()
w: 只写模式,文件不存在则会创建新文件,文件存在则清空,指针处于开头
eg.
f = open(\'a.txt\',mode=\'wt\',encoding=\'utf-8\') # 原有文件被清空
f.write("你好\\n哈哈哈\\nlalala\\n")
print(f.readable()) # Flase
print(f.writable()) # True
f.close()
w模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面
a: 追加写模式,文件不存在则新建,文件存在不会清空,文件指针处于文件末尾,只写不读
eg.
f = open(\'a.txt\',mode=\'at\',encoding=\'utf-8\')
f.write("你好\\n哈哈哈\\n我擦勒\\n")
print(f.readable()) # Flase
print(f.writable()) # True
f.clos
a模式,在打开了文件不关的情况下,连续的write写入,新写的内容永远跟在后面,这一点与w模式相同
不同的是,在打开了文件关闭然后重新打开的情况下,a模式永远写在后面
控制文件读写的操作方式
t: (默认),读写以字符串为单位,只用于文本文件,必须指定encoding参数
eg.
with open(\'a.txt\', mode=\'rt\', encoding=\'utf-8\')as f:
print(f.read())
b: 读写都是以bytes为单位的,适用于所有文件,一定不能指定encoding参数
eg.
with open(\'a.txt\',mode=\'rb\') as f:
res = f.read()
print(res.decode(\'utf-8\'))
文件打开的混合方式
r+t : 既可以读又可以写,倾向于r模式
w+t :可读可写,倾向于w模式,如果又要读又要写,则文件打开会先清空,再写
a+t : 可读可写
r+b:可读可写
w+b:可读可写
a+b:可读可写
文件操作的其他方法
readline(): 文件只读一行
readlines(): 文件一行一行读,放在一个列表中,可以用for循环的方式实现
eg.
with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
print(f.readline()) # 一行
print(f.readlines()) # 全部,形成一个列表
# 也可以用for循环实现
for i in f:
lines[].append(i)
print(lines)
writelines(): 把要写的内容放在一个列表中,直接把这个列表传给writelines()
eg.
with open(\'a.txt\', mode=\'wt\', encoding=\'utf-8\')as f:
lines = [\'koala\\n\', \'yugali\\n\', \'lalala\\n\']
f.writelines(lines)
控制文件指针的移动
只有t模式下的,f.read(n)中的n代表的是字符个数,除此以外,关于指针的移动,单位都是字节bytes
一个英文字符占一个字节,一个中文字符三个字节
文本文件中,没有使用b模式选项打开的文件,只允许从文件头开始计算相对位置
- f.read()
eg.
with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
res = f.read(5)
print(res)
read读模式打开,文件指针在开头,括号里面跟几就是从左往右读取几个字节,t模式下字符为单位,其他均为字节
- f.truncate()
eg.
with open(\'a.txt\',mode=\'r+t\',encoding=\'utf-8\') as f:
f.truncate(8)
截取,顾名思义,不能是r模式,不能是w模式(打开会直接清空),a模式或是r+t模式也行
打开文件,指针从文件开头截取到<truncate(n)>第n个字节保留,其他全部清空
- seek()
f.seek(字节个数,0) ---指针在文件开头
f.seek(字节个数,1) ---指针在文件当前位置
f.seek(字节个数,2) ---指针在文件末尾
eg.
with open(\'a.txt\',mode=\'rt\', encoding=\'utf-8\')as f:
f.seek(3, 0) # 文件从开头向右移动三个字节
print(f.tell()) # 打印文件移动了几个字节 3
print(f.read()) # 打印指针后的内容
with open(\'a.txt\', mode=\'rb\') as f:
f.seek(5,1) # 文件从开头向右移动五个字节
print(f.tell())
print(f.read()) # 打印指针后的内容
with open(\'a.txt\', mode=\'rb\') as f:
f.seek(0, 2) # 第0个位置开始,直接跳到文件末尾
print(f.tell())
f.seek(-3, 2) # 从文件末尾往左移动三个字节
print(f.tell())
print(f.read().decode(\'utf-8\')) # 打印指针后的内容
以上是关于Day 09 文件处理的主要内容,如果未能解决你的问题,请参考以下文章