文件的概述
文件:存储在计算机的存储设备的一组数据序列
不同类型的文件通过后缀名进行区分
- 文本文件:由于编码格式(ANSL,UTF-8等等)不同,所占磁盘空间的字节数不同
- 二进制文件:没有统一的编码,文件直接有0,1组成,需要使用指定的软件才能打开
文件的基本操作
操作文件的步骤
- 打开文件
- 操作文件
- 关闭文件
文件是操作系统中的一个重要资源,需要被正确管理,避免资源泄露,切勿忘记关闭文件从而导致某些潜在问题
打开与关闭文件
格式:
变量名=open(filename,mode,encoding)
filename:文件名
mode:打开文件的方式(默认是r)
encoding:文本模式下指定文件的字符编码
file=open('a.txt','w',encoding='utf-8')#注意格式需要用字符串‘’
本段代码的意思是以‘只写’模式打开(或创建)一个a.txt文件, 字符编码为utf-8
关闭文件
变量名.close()
以下是文件简单操作的完整流程:
def my_write():
file = open('a.txt', 'w', encoding='utf-8') # 注意格式需要用字符串
file.write('我是一个菜鸟QAQ') #写入操作
file.close #关闭文件
if __name__=='__main__': #主程序运行
my_write() #调用这个函数
就会有一个文件在你的代码附近
文件的打开模式
r:以只读模式打开,文件一定要存在才行,否则报错
rb:以二进制方式只读,其他一样
w:只写,文件如果不存在会自动创建,只能写入无法读取,而且新内容会覆盖原有内容
wb:二进制只写,其他一样
a:追加,文件如果不存在会自动创建,新内容直接在文件末尾自动追加内容
ab:二进制追加,其他一样
+:与w/r/a等一同使用(eg.w+,r+)在原功能的基础上增加读写功能
文件的读写方式
file.read(size):从文件中读取size个字符或字节,如果没有给定参数,就读取文件的全部内容
file.readline(size):读取文件中的一行数据,如果给定参数则读取这一行size个字符或字节
file.readlines():读取文件全部内容,结果为列表类型
file.write(s):将字符串s写入文件
file.writelines(lst):将内容全部为字符串风列表lst写入文件
file.seek(offset):改变当前文件操作指针(相当于移动光标)的位置,英文占1个字节,中文(gbk)占2个,中文(utf-8)占3个
下面是部分功能的实例:
def my_read(filename):
#1,打开(创建)一个文件,w+模式(可读可写)
file=open(filename,'w+',encoding='utf-8')
#2,操作
file.write('零一二三四')#写入完成,此时光标在最后
#seek:修改光标位置
file.seek(0)#括号里是填入字节的,这里表示将指针调到开头
#file.seek(6)表示跨6个字节也就是‘一’后面(utf-8三个字节)
s=file.read()#从光标的位置往后读
print(type(s),s)
file.close()
if __name__=='__main__':
my_read('a.txt')#创建文件
结果为:
<class 'str'> 零一二三四
这里讲一讲seek的部分使用方法:
seek是用于移动文件中指针位置和指定指针移动偏移量大小,后面填的是字节数,光标的位置会影响到后续操作。
比如这里我seek那填0与6会影响read那读取的字符,所以使用是需要注意括号后写的是多少,字节数的填写看看你的字符编码,在这个代码里填1肯定报错,因为一个字符占3个字节。
文件的复制
文件的复制就相当于边读边写操作
下面是演示:
def copy(src,new_path):
#1,打开源文件
file1=open(src,'rb')
#2,打开目标文件
file2=open(new_path,'wb')
#3,开始复制,边读编写
s=file1.read() #源文件读取所有
file2.write(s) #向目标文件写入所有
#4.关闭
file2.close() #先关copy的文件
file1.close() #再关被复制的文件
在打开关闭文件的时候需要注意他们的顺序,需要复制的文件一定是先打开最后在关闭的。
with语句
又叫上下文管理器,在处理文件时,无论是否产生异常,都能保证with语句执行完毕后关闭已经打开的文件,无需手动关闭文件
语法结构:
with open(...) as file:
pass
def write_fun():
with open('aa.txt','w',encoding='utf-8') as file:
file.write('北京欢迎你')
就无需close了
数据的组织维度与存储
在Python中常用的数据组织方式分为一维数组,二维数组,高维数组
- 一维数组:采用线性方式组织数据,一般使用列表,元组或者集合进行存储数据
- 二维数组:由行和列组成,也叫表格数据,一般使用二维列表
- 高维数组:使用Key——Value方式进行组织数据,使用字典进行存储数据,在Python中内置的json模块专门用于处理JSON格式的数据
目录与文件的相关操作
OS模块的执行效果通常与操作系统有关,操作系统不同,效果可能不一样
getcwd():获取当前工作路径
listdir(path):获取path路径下的文件和目录信息,如果没有指定path,则获取当前路径下的文件和目录信息
mkdir(path):在指定路径下创建文件夹
makedirs(path):创建多级目录
rmdir(path):删除path下的空目录
removedirs(path):删除多级目录
chdir(path):把path设置为当前路径
walk(path):遍历目录数,结果为元组
remove(path):删除path指定的文件
rename(old,new):将old重命名为new
stat(path):获取path指定的文件信息
startfile(path):启动path指定的文件
下面是部分实例:
import os #插入os模块
print('当前的工作路径',os.getcwd())
print('当前路径下的所有目录与文件',os.listdir())
结果为
当前的工作路径 C:\Users\Dell\Desktop\Keilproject
当前路径下的所有目录与文件 ['2-4LED流水灯plus', '3-1独立按键控制', '3-2控制LED的状态', '3-2控制LED的状态.uvgui.Dell', '3-2控制LED的状态.uvopt', '3-2控制LED的状态.uvproj', '3-3二进制控制LED', '3-4独立软件控制LED移位', '4-1数码管显示原理', '5-1模块化编程', '5-2LCD1602', '5-2LCD1602调试.uvgui.Dell', '5-2LCD1602调试.uvopt', '5-2LCD1602调试.uvproj', '6-1矩形键盘', '6-2矩形键盘 密码锁', '7-1定时器', '7-2定时器时钟', '8-1串口控制', '8-1电脑通过串口控制LED', 'a.txt', 'damo.py', 'led', 'LED闪烁.uvgui.Dell', 'LED闪烁.uvopt', 'LED闪烁.uvproj', 'Listings', 'main.c', 'mian.c', 'Objects', 'STARTUP.A51', 'zncl', '动态数码管显示', '控制速度模块', '智能窗帘', '智能窗帘 - 副本', '智能窗帘 - 副本 (2)', '智能窗帘2', '点亮一个LED.uvgui.Dell', '点亮一个LED.uvopt', '点亮一个LED.uvproj', '电机']
os.path 模块
abspath(path):获取目录与文件的绝对路径
exists(path):判断文件或目录在磁盘中是否存在,结果为bool类型,如果存在输出Ture,反之False
join(path,name):将目录名或文件名进行拼接,相当与+号
splitext():分别获取文件名与后缀名
basename(path):从path中提取文件名
dirname(path):从path中提取路径(不包括文件名)
isdir(path):判断path是否是有效路径
isfile(path) :判断file是否是有效文件
import os.path
print('判断文件是否在磁盘中存在',os.path.exists('a.txt'))
判断文件是否在磁盘中存在 True
总结
文件的操作丰富多样但都比较简单,去了解一下绝对路径与相对路径以及各个操作系统的不同什么的或许对你会有帮助
有错误请指出Thanks♪(・ω・)ノ