Day 09 文件处理

Posted 北冷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day 09 文件处理相关的知识,希望对你有一定的参考价值。

文件处理

文件操作

概念

什么是文件?

文件是操作系统提供给用户或者说应用程序操作硬盘的一种功能

为什么有文件?

读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作

基本流程

文件操作的流程:

  1. 打开文件,得到文件句柄并赋值给一个变量
    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模式选项打开的文件,只允许从文件头开始计算相对位置

  1. f.read()

eg.

with open(\'a.txt\',mode=\'rt\',encoding=\'utf-8\') as f:
    res = f.read(5)
    print(res)

read读模式打开,文件指针在开头,括号里面跟几就是从左往右读取几个字节,t模式下字符为单位,其他均为字节

  1. 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个字节保留,其他全部清空

  1. 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 文件处理的主要内容,如果未能解决你的问题,请参考以下文章

反射机制入门

day09进程与异常处理

CGBTN2111-DAY09总结复习

CGBTN2111-DAY09总结复习

CGBTN2110-DAY09总结复习

CGBTN2111-DAY09总结复习