Python简单文件操作day9
1、文件操作的重要性和场景
重要性:
数据持久化、跨平台兼容性、数据备份与恢复、数据共享、配置管理、日志记录
应用场景:
数据分析、web开发、文本处理
2、文件的概念
文件是一个存储在某种持久性存储介质【硬盘、光盘、磁盘等】上的数据的结合。
文件可以包含各种类型的信息:文本、图像、音频、视频、应用程序代码以及其他类型的二进制数据。
文件通常由数据、元数据、文件系统等几部分组成。
文件的属性有:文件名、位置、文件类型、文件大小、创建日期、修改日期、访问权限。
2.1.2文件的分类
windows系统下大致分为以下几种:
- 文本文件:包含可读字符的文件,如.txt .csv .py .html等
- 二进制文件:包含不可直接读的原始二进制数据的文件,如.exe .jpg .mp3等
- 可执行文件:可以被操作系统执行的文件,如.exe
- 数据文件:用于存储应用程序数据的文件,如数据库文件、配置文件等
- 目录/文件夹:用于组织和管理其他文件的特殊文件
在Linux系统下,有以下几种:
- - 普通文件
- d 目录文件
- b 块设备文件【底层驱动文件】
- c 字符设备文件【底层驱动文件】
- l 链接文件【类似于快捷方式】
- p 管道文件,用于进程间的通信
- s 套接字文件,用于网络通信的端点
文本文件:
- 文本文件是由单一特定编码组成的文件,如UTF-8编码。
- 由于存在编码,文本文件也被看成是存储着数据的长字符串。
二进制文件:
- 直接由比特0和1组成,没有统一字符编码
- 一般都存在二进制0和1的组织结构,即文件格式
s='你好世界'
print(s)
print(s.encode())#二进制
2.1.3文件位置
绝对路径:带有盘符的或者带有网址的
C:\Users\admin\Desktop\py_gj\py_day3
相对路径:
./py_gj/py_day3 当前路径
../py_gj/py_day3 上一级路径
2.2文件操作
2.2.1打开文件open
语法:
open(file, [mode='r', buffering=-1, encoding=None])
参数:
- file: 必需,文件路径(相对或者绝对路径)
- mode: 可选,文件打开模式,默认为r
- buffering: 可选,设置缓冲
- encoding: 可选,一般使用utf-8
返回值:一个文件对象
mode常用的模式:
打开方式 | 功能 | 文件存在时 | 文件不存在时 |
r | 只读方式打开文件 | 打开 | 报错 |
r+ | 以读写方式打开文件 | 打开 | 报错 |
w | 只写方式打开文件 | 打开(清空之前内容) | 新建 |
w+ | 以读写方式打开文件 | 打开(清空之前内容) | 新建 |
a | 以追加方式打开文件(写) | 打开,保留之前内容 | 新建 |
a+ | 以读写方式打开文件 | 打开,保留之前内容 | 新建 |
mode参数还可以指定以什么样的编码方式读写文本,默认情况下open是以文本形式打开文件的,比如上面的四种mode模式。
当我们需要以"字节[二进制]"形式读写文件时,只需要在mode参数的后面加 b 就可以了。
- rb 以二进制形式打开一个文件,只读
- wb 以二进制形式打开一个文件,只写
- wb+ 以二进制形式打开一个文件,读写
demo1:读取文件
- 我们在同级目录下创建一个名为111的txt文本文件,同时创建一个test.py文件,通过代码去读取其中的内容。
- 我们在111.txt中写入两行内容: Life is short, You need Python 人生苦短,我用python
- 然后在test.py中写入读取代码
# 1、打开文件
f = open("./111.txt", encoding='utf-8')
# 2、读取内容
read_data = f.read()
# 3、输出读取到内容
print(read_data)
# 4、关闭
f.close()
2.2.2with关键字
当我们使用open直接打开文件,进行文件操作后,需要使用close进行文件保存和关闭。但是这种方式不是最好的,为什么呢?因为在文件操作过程中一旦有报错,那么文件还能正确关闭吗?——不能
如何解决呢?——使用 with 关键字
优点:当我们操作文件的代码块结束后,文件会正确关闭,即便文件操作报错,也会正确关闭,无需手动调用close()
with open('./111.txt', encoding='utf-8') as f:
read_data = f.read()
print(read_data)
2.2.3关闭文件close()
语法格式:
file.close()
2.2.4 read()方法
语法格式:
f.read(size) # f为文件对象
参数:
- size(可选):为数字,表示从已打开文件中读取的字节计数,默认值为-1,默认情况下为读取全部。
with open('./111.txt', encoding='utf-8') as f:
read_data = f.read(5)
print(read_data)
2.2.5 readline()方法与readlines()方法
1.readline()方法
f.readline(size)
参数size表示从文件读取的字节数
with open('./111.txt', encoding='utf-8') as f:
x = f.readline(5)
y = f.readline()
z = f.readline()
print(x, y, z)
注意: readline()方法会记住上一个readline()读取的位置,接着读取下一行
2.readlines()方法
读取文件的所有行,返回值是一个列表
with open('./111.txt', encoding='utf-8') as f:
x = f.readlines()
print(x)
# ['我的文件内容是这样的\n', 'Life is short, You need Python\n', '人生苦短,我用python']
2.2.6 write()方法
在python中使用write()方法将字符串写入文件中。
f.write(str) # f为文件对象
参数:
- str代表要写入的字符串
demo:
s = '欢迎来到华清远见上海中心\n时间是2024年11月14日\n星期四'
with open('./111.txt', encoding='utf-8', mode='w') as f:
f.write(s)
2.2.7 文件指针定位
f.tell()
功能:返回文件的当前位置,即文件指针当前位置
fileObject.seek(offset[, whence])
功能:将文件内部光标定位到指定的位置
参数:offset:开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0,
0代表从文件开头开始算起
1代表从当前位置开始算起
2代表从文件末尾算起
eg:
f.seek(p,0) 移动到文件第p个字节处,绝对位置
f.seek(p,1) 移动到相对于当前位置之后的p个字节
f.seek(p,2) 移动到相对文章尾之后的p个字节
f.seek(0,0) 移动到文件开头
s='hello world!'
with open('wenzhang','wb+')as f:
f.write(s.encode())
f.seek(-3,2)
f.seek(1,1)
print(f.read(1))
#输出是b'd'
引用os,可以进行目录删除与创建
import os
try:
os.mkdir('./一层目录')
except Exception as e:
print(e)
try:
os.rmdir('./一层目录./二层目录')
os.rmdir('./一层目录')
except Exception as e:
print(e)
try:
os.makedirs('./一层目录./二层目录')
except Exception as e:
print(e)
将 1-100 之间能被 5 整除的数保存在列表 numbers 中
1. 将 numbers 中的元素写入到文件 num.txt 中
2. 使用文件操作方式打开 num.txt 文件读取内容,并计算它们的平均数
numbers=[str(i)+'\n' for i in range(1,101) if i%5==0]
with open('./num.txt',mode='w')as f:
f.writelines(numbers)
with (open('num.txt','r')as f):
print(f.readlines())
f.seek(0)
sum=0
for i in f.readlines():
sum+=int(i)
print(sum/len(numbers))