文件操作
我们曾将听过一个问题, 将大象放入冰箱分为三步: 1, 打开冰箱门, 2, 将大象放进去, 3, 关上冰箱门. 今天我们要讲的 Python 文件操作的步骤就像将大象放入冰箱的步骤一样.
使用 Python 操作文件的基本步骤:
打开文件
对文件内容进行操作(读取文件信息, 向文件中写入信息等)
关闭文件
一, 打开文件
在上一篇的内置函数介绍中, 我们提到了 open 这个函数, 这个函数的作用就是打开一个文件.
格式一
文件句柄 = open(文件路径, 打开格式, 编码)
打开文件时, 需要指定文件路径和以何种方式打开文件, 打开后, 即可获取该文件句柄, 如后通过此文件句柄对该文件操作.
- f = open("c:/asd.txt","r",encode='utf-8') #打开 c 盘下的 asd.txt 文件
- date = f.read() #读取文件内容
- f.close() #关闭文件
- print(date) #输出文件内容
格式二
with open(文件路径, 打开格式, 编码), 使用这个打开文件不用再最后使用 close()关闭文件, 因为使用这个 with 自动进行文件关闭, 但是这个需要你文件的操作都在代码块中, 注意缩进.
- with open("c:/asd.txt",encoding='utf-8') as f:
- data = f.read()
- print(data)
代开文件的各种格式
打开文件时, 需要指定文件路径和以何种方式打开文件, 打开后, 即可获取该文件
句柄, 如后通过此文件句柄对该文件操作.
打开的模式有:
r, 只读文件,[默认]
w, 只写文件,[不可读, 不存在创建; 存在则清空内容]
x, 只写文件,[不可读, 不存在创建, 存在则报错]
a, 追加模式,[不可读, 不存在创建, 存在则只追加内容]
"+" 表示可以同时读写某个文件
r+, 读写[可读, 可写]
w+, 写读[可读, 可写]
x+, 写读[可读, 可写]
a+, 写读[可读, 可写]
"b" 表示以字节的方式操作
rb 或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
以 b 方式打开时, 读取到的内容是字节类型, 写入时也需要写入的是字节类型.
二, 对文件内容进行操作
使用一般格式打开文件
1, 使用只读格式打开文件的时候, 进行文件写入就会报错.
2, 使用写入格式代开文件的时候, 会清除原有内容, 然后重新写入内容.
- f = open("asd","w")# 清空原有文件内容
- f.write("asd")# 重新写入
- f.close()
3, 使用只写模式打开文件, 没有文件就创建, 有文件的时候就报错.
然后我们再次使用上一条命令, 就会发生报错, 因为文件存在了.
4, 追加模式打开文件, 当文件不存在的时候创建文件, 当文件存在的时候在文件结尾追加内容.
- f = open("asd","a")# 不存在创建, 存在追加
- f.write("asd")
- f.close()
使用字节格式打开文件
1, 只读格式
- f = open("asd","rb")# 在这里打开时是以字节方式读, 所以不需要加 encoding="utf-8"
- data = f.read()
- f.close()
- print(type(data))
输出结果:
<class 'bytes'>
2, 只写格式
- f = open("asd","wb")
- data = f.write(bytes("中国",encoding = "utf-8"))
- f.close() #用字节方式写入时, 需要把字符串转换为字节
两种打开方式的内部编码机制
普通格式
python 内部将 010101 自动转换为字符串(因为在本质上在在硬盘里存的就是 0101, 所以在读取数据时也是 0101, 而普通打开时, 会自动将字节转换为字符串默认使用 utf-8 编而在转字符串是我们可以指定什么编码格式转成字符串).
010101======>python 解释器 (转换为字符串)=====> 程序员看到
字节格式
用字节方式打开时字节直接给到程序员, 没有编译过程, 所以不能添加 encoding =""在你写入是, 如果你写入的是字符串, 你需要吧字符串转换为 010101, 不然会报错因为字节方式打开没有编译过程, 存储时也不会自动编译成 0101 所以需要自己吧字符串转换为字节 f.write(bytes(" 中国 ",encoding ="utf-8")), 才能保存.
010101======>程序员看到
示例
使用字节格式读取文件, 文件里原来存储的是 "中国".
- f = open("asd","rb")
- data = f.read()
- f.close()
- print(data)
- data1 = str(data,encoding = "utf-8")
- # 如果是用 python 存储的就是 utf-8, 如果是自己在记事本写的可能需要用 gbk
- print(data1)
输出结果:
b'\xe4\xb8\xad\xe5\x9b\xbd'
中国
使用字节格式写入文件, 文件中存储的还是 "中国".
- f = open("asd","wb")
- str_a = "中国"
- bytes_a = bytes(str_a,encoding="utf-8")
- f.write(bytes_a)
- print(bytes_a)
- f.close()
输出结果:
b'\xe4\xb8\xad\xe5\x9b\xbd'
使用一般格式输入输出的都是字符串, 使用字节格式输入输出的都是字节, 在我们使用的时候一般不使用字节格式进行文件读写.
有关读写文件内部指针问题
- f = open("world.txt", "r+",encoding='utf-8')
- data = f.read()
- print(type(data), data)
- f.write("地球村")
- a = f.read()
- print(type(a), a)
- # 在这里输出的是空的, 在读写时有一个指针, 你读一个, 指针就向后移一个, 追加一个字符就再向后移一个, 等你再次输出是, 指针就指向空的地方, 所以输出是空的
- print(f.tell())# 输出指针位置, 字节, 一个汉字三个字节
- f.close()
输出结果:
- <class 'str'> 地球
- <class 'str'>
- 9
相关示例:
文件原内容: alexsel
- f = open("name.txt", "r+")
- data = f.read(3)
- print(type(data), data)
- print(f.tell()) #输出当前指针位置
- f.write("地球村")
- print(f.tell())
- a = f.read()
- print(type(a), a)
- print(f.tell())
- f.close()
输出结果:
- <class 'str'> ale
- 3
- 13
- <class 'str'> xsel
- 13
我们指针之前的字符进行读取怎么办, 我们可以使用 seek()调整指针位置.
- f = open("name.txt","w+",encoding="utf-8")
- f.write("三顾茅庐")
- f.seek(0) #这个可以将指针移动到最开始(0), 不移动, 在输出是就的是空的
- data = f.read()
- f.close()
- print(data)
输出结果:
三顾茅庐
使用追加模式打开文件的时候, 文件指针直接在最后.
- f = open("asda.log","a+",encoding="utf-8")
- print(f.tell()) #使用追加的时候, 打开文件的时候, 指针直接在最后
- data = f.read()
- print(data) #指针直接在最后, 所以这里输出为空
- f.seek(0)
- data = f.read()
- print(data)
- f.close()
输出结果:
7
alexsel
三, 文件关闭
之前我们在文件操作中一直在使用, 使用 close()进行文件关闭, 不对文件文件关闭会导致出错.
文件操作中使用到的方法
file 为文件句柄
file.close()
方法刷新缓冲区里任何还没写入的信息, 并关闭该文件, 这之后便不能再进行写入.
file.write()
向文件中写入数据
file.fulsh()
刷新文件内部缓存区
- f1 = open("asda.log","r+",encoding="utf-8")
- f1.write("啊啊啊啊啊")
- f1.flush()
- f1.seek(0)
- print(f1.read())
输出结果:
啊啊啊啊啊
当文件还没有关闭时, 这些东西就还没有存到硬盘里, 只是在内存里就像你在记事本输入了一串字符但是没有保存一样, 只是在内存里, flush()功能就是把写入的字符进行存储, 就像记事本里的保存一样, 把内存的内容刷新到硬盘里.
file.name
获取操作文件的文件名
- f = open("name.txt","r+",encoding="utf-8")
- ut = f.name
- print(ut)
输出结果:
- name.txt
- file.readable()
判断打开文件是否可读
- f1 = open("asda.log","r+",encoding="utf-8")
- pd=f1.readable()
- print(pd)
输出结果:
- True
- file.readline()
仅读取一行数据(自动把指针放在第一行末尾, 再读时, 就是从第二行开始)
- # 问价内容: 第一行是三顾茅庐, 第二行是 alexsel
- f1 = open("name.txt","r+",encoding="utf-8")
- data = f1.readline()
- print(data)
- data1 = f1.readline()
- print(data1)
- f1.close()
输出结果:
三顾茅庐
- alexsel
- file.seekable()
指针是否可操作
- f1 = open("name.txt","r+",encoding="utf-8")
- ut = f1.seekable()
- print(ut)
- f1.close()
输出结果:
True
总结:
不管是读文件还是写文件, 操作完成后都要调用 close()来关闭文件
但是调用 with... as 就可以省去 close()了
可以指定读取和写入文件编码方式, 就是在对用函数中加入 encoding='xxx'
我们可以使用各种方法方便我们对文件的操作
读写文件是我们需要注意一下指针的位置
今天的 Python 的文件操作就到这里, 这里仅仅是简单的学习, 以后我们做简单的项目的时候会加深练习.
来源: https://www.cnblogs.com/liudi2017/p/9189363.html