文件操作:对磁盘数据的读写操作
读写操作:read write
IO操作:inputstream字节输入流 outstream字节输出流
打开文件
open(file, mode='r', buffering=-1, encoding_=None, errors=None, newline=None, closefd=True, opener=None)
- 使用open函数来打开一个文件返回对应的 file object。如果该文件不能打开,则触发 OSError。
open()参数讲解
①file 要打开的文件的名字(路径)
返回值: 返回一个对象,这个对象就代表了当前打开的文件
②mode 用于指定打开文件的模式,mode 参数是可选的;省略时默认为 ‘r’。
参数值 | 含义 |
---|---|
‘r’ | 表示文件只能读取。 |
‘w’ | 表示只能写入(已存在的同名文件会被删除)。 |
‘a’ | 表示打开文件以追加内容;任何写入的数据会自动添加到文件的末尾。 |
‘r+’ | 表示打开文件进行读写。 |
‘b’ | 二进制模式 |
‘t’ | 文本模式(默认) |
‘x’ | 排它性创建,如果文件已存在则失败 |
③ buffering 可选的整数,用于设置缓冲策略。
参数值 | 含义 |
---|---|
0 | 以切换缓冲关闭(仅允许在二进制模式下) |
1 | 选择行缓冲(仅在文本模式下可用) |
>1的整数 | 以指示固定大小的块缓冲区的大小(以字节为单位) |
④encoding 是用于解码或编码文件的编码的名称。只在文本模式下使用。
⑤errors 可选的字符串参数,用于指定如何处理编码和解码错误 - 这不能在二进制模式下使用。
⑥ewline 控制 universal newlines 模式如何生效(它仅适用于文本模式)。
它可以是 None,’’,’\n’,’\r’ 和 ‘\r\n’。
⑦closefd 是 False 并且给出了文件描述符而不是文件名,那么当文件关闭时,底层文件描述符将保持打开状态。
如果给出文件名则 closefd 必须为 True (默认值),否则将引发错误。
⑧opener 通过传递可调用的 opener 来使用自定义开启器。然后通过使用参数( file,flags )调用 opener 获得文件对象的基础文件描述符。opener 必须返回一个打开的文件描述符。
文件分类
调用open()来打开一个文件,可以将文件分成两种类型
- 纯文本文件(使用utf-8等编码编写的文本文件)
- 二进制文件(图片、mp3、ppt等这些文件)
open()打开文件时,默认是以文本文件的形式打开的,但是open()默认的编码为None。所以处理文本文件时,必须要指定文件的编码。常见编码有GBK 、GB2312 、UTF-8 、ASCII
file_name = 'demo.txt'
try:
with open(file_name,encoding='UTF-8') as file_obj :
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name} 文件不存在~~')
路径规范
- 如果目标文件和当前文件在同一级目录下,则直接使用文件名即可
- 在windows系统使用路径时,可以使用/来代替 \ 。或者可以使用 \ 来代替 \。或者也可以使用原始字符串
- 使用…来返回一级目录
- 如果目标文件距离当前文件比较远,此时可以使用绝对路径。绝对路径应该从磁盘的根目录开始书写
创建一个变量,来保存文件的名字
如果目标文件和当前文件在同一级目录下,则直接使用文件名即可
file_name = '0716.py'
file_obj = open(file_name)
print(file_obj)
# 在windows系统使用路径时,可以使用/来代替 \
# 或者可以使用 \\ 来代替 \
# 或者也可以使用原始字符串
file_name = 'hello\\demo.txt'
file_name = r'hello\demo.txt'
file_obj = open(file_name)
print(file_obj)
# 表示路径,可以使用..来返回一级目录
file_name = '../hello/demo.txt'
file_obj = open(file_name)
print(file_obj)
# 如果目标文件距离当前文件比较远,此时可以使用绝对路径
# 绝对路径应该从磁盘的根目录开始书写
file_name = r'C:\Users\Desktop\hello.txt'
file_obj = open(file_name) # 打开 file_name 对应的文件
print(file_obj)
读取文件
- 直接使用read()
read()方法,用来读取文件中的内容,它会将内容全部保存为一个字符串返回
# 打开文件
file_name = 'demo.txt'
# 调用open()来打开文件
file_obj = open(file_name)
# 当我们获取了文件对象以后,所有的对文件的操作都应该通过对象来进行读取文件中的内容
# read()方法,用来读取文件中的内容,它会将内容全部保存为一个字符串返回
content = file_obj.read()
print(content)
通过read读取文件的时候,机制效率不是很好。他可以将文件里面所有内容读取,如果有海量数据、大数据 不能直接调用
强制使用会造成数据发送阻塞 数据泄露 损失数据完整,违背数据事物的原子性粒子性等
- read(size)
read()可以接收一个size作为参数,该参数用来指定要读取的字符的数量。默认值为-1,它会读取文件中的所有字符- 每一次读取都是从上次读取到位置开始读取的
- 如果字符的数量小于size,则会读取剩余所有的
- 如果已经读取到了文件的最后了,则会返回’'空串
file_name = 'demo.txt'
with open(file_name,encoding='utf-8') as file_obj:
#content = file_obj.read(-1) # 返回全部数据
content1 = file_obj.read(17) # 返回前17条数据
# print(content)
# print(len(content)) # 28
print(content1)
- 读取大文件
定义一个变量chunk
# 读取大文件的方式
file_name = 'demo.txt'
try:
with open(file_name,encoding='utf-8') as file_obj:
# 定义一个变量,来保存文件的内容
file_content = ''
# 定义一个变量,来指定每次读取的大小
chunk = 100
# 创建一个循环来读取文件内容
while True:
# 读取chunk大小的内容
content = file_obj.read(chunk)
# 检查是否读取到了内容
if not content:
# 内容读取完毕,退出循环
break
# 输出内容
file_content += content
print(file_content)
print(content, end='') # 两个输出等价
except FileNotFoundError :
print(f'{file_name} 这个文件不存在!')
- readline() 、readlines()
readline()该方法可以用来读取一行内容
readlines() 该方法用于一行一行的读取内容,它会一次性将读取到的内容封装到一个列表中返回
import pprint
import os
file_name = 'demo.txt'
with open(file_name , encoding='utf-8') as file_obj:
print(file_obj.readline(),end='')
print(file_obj.readline())
print(file_obj.readline())
r = file_obj.readlines()
print(r) # ['1\n', '2\n', '3\n', '4\n', '\n', '你好\n', '我好\n']
pprint.pprint(r[0])
for t in file_obj:
print(t)
# 1
#
# 2
#
# 3
#
# 4
#
#
#
# 你好
#
# 我好
写入文件
给指定文件写入内容,如果源文件内有内容则删除,若内容与新内容相同,覆盖。它也支持类型转换的语法操作。
file_name = 'demo.txt'
with open(file_name,encoding='utf-8') as file_obj:
# 对文件进行读写操作
file_obj.write('张涛最帅!!!') # io.UnsupportedOperation: not writable
发现无法写入,原因是open函数中的mode参数值未修改。
file_name = 'demo.txt'
with open(file_name,'w',encoding='utf-8') as file_obj:
# 对文件进行写操作 w
file_obj.write('张涛最帅!!!\n')
file_obj.write('1234\n')
with open(file_name,'a',encoding='utf-8') as file_obj:
# 对文件进行追加内容操作 a
file_obj.write('张涛最帅!!!\n')
file_obj.write('1234\n')
with open(file_name,'x',encoding='utf-8') as file_obj:
# 对文件进行排它性创建,如果文件已存在则失败
file_obj.write('张涛最帅!!!\n')
file_obj.write('1234\n')
with open(file_name,'r+',encoding='utf-8') as file_obj:
# 打开文件进行读写
file_obj.write('张\n')
file_obj.write('121\n')
关闭文件
- close()方法,用来关闭读取的文件。不关闭文件容易造成数据泄露
jdbc关闭次数:4次 collection statement resultset class.forname 操作四次麻烦
如何解决:大学:jdbcutils 企业:c3p0 jndi datasource–mybatis
利用以上进行资源操作,资源肯定不会泄露,服务器读取快,性能较高,安全。
file_name = 'demo.txt'
file_obj = open(file_name)
content = file_obj.read()
print(content)
file_obj.close() # 文件已关闭
content1 = file_obj.read()
print('关闭',content1) # I/O operation on closed file. 已经打不开
- 多次关闭文件with open(file_name) as file_obj:
面对需要频繁close的时候 用 with as
在with语句中可以直接使用file_obj来做文件操作
此时这个文件只能在with中使用,一旦with结束则文件会自动close()
file_name = 'demo.txt'
with open(file_name) as file_obj:
print(file_obj.read()) # 执行完后自动close
content1 = file_obj.read()
print('关闭',content1) # I/O operation on closed file.
异常操作 try: except:
程序读取不到文件时属于什么异常? i/o异常
原因:
- 程序在读取过程中,肯定有找不到的情况 FindNotFoundError
- 变量没有赋值,io操作里有很多不可控因素
file_name = 'hello'
try:
with open(file_name) as file_obj :
print(file_obj.read())
except FileNotFoundError:
print(f'{file_name} 文件不存在~~')