概述
计算机文件是存储在外部存储器上的数据集合。通常计算机处理的大量数据都是以文件的形式组织存放的,操作系统也是以文件为单位对数据进行管理的。
每个文件都有一个文件名,文件名由基本名和扩展名组成,不同类型的文件扩展名也不相同。
文本文件扩展名.txt,Word文档扩展名一般为.docx,可执行文件扩展名.exe,C语言源文件扩展名.c等
在计算机系统中,文件种类众多,其处理方法和用途各不相同。在计算机中,文件一般按文件内容和信息存储形式分类。
1、按文件内容分类
计算机文件按文件内容可分为程序文件和数据文件。
程序文件存储的是程序,包括源文件和可执行文件,如Python源文件(扩展名为.py),C++源文件(扩展名为.cpp),可执行文件(扩展名为.exe)等都是程序文件。
数据文件存储的是程序运行所需要的各种数据,如文本文件(.txt)、Word文档(.docx)、Excel工作薄(.xlsx)等
2、按信息存储形式分类
计算机文件按存储信息形式可分为文本文件和二进制文件。文本文件是基于字符编码的文件,常见编码方式有ASCII编码、Unicode编码等,可以使用文本编辑软件建立和修改,如记事本、EditPlus、UltraEdit等。常见的文本文件有文本格式文件(.txt)、网页文件(.html)等。
二进制文件中存放的是各种数据的二进制编码,含有特殊的格式及计算机代码,必须用专用程序打开。
常见的二进制文件有数据库文件、图像文件、可执行文件、音频文件等。
同样的数据,存放在不同类型的文件中,其存储格式和所需的空间大小也不相同。例如整数567,若以ASCII形式存储,需要3个字节;若以二进制形式存储,则一般需要2个字节(有的需要4个字节)
ASCII码存储形式: 35 36 37
二进制存储形式: 02 37
文本文件访问
在Python中,访问文本文件可以分为三步
(1)用open()函数打开一个文件,返回一个文件对象
(2)调用文件对象中的函数对文件内容进行读或写等操作
(3)调用文件对象的close()函数关闭文件
打开文件
1、open()函数
Python内置的open()函数用于打开一个文件,返回一个文件对象:
open(filename[,mode])
这里只是句柄,只要不读取文件内容,并不会增加内存消耗!
其中,filename为要打开的文件名称及路径。mode为文件访问模式:
文件访问模式
模式 | 简述 | 描述 |
---|---|---|
r | 只读,默认 | 以只读方式打开文件,默认模式 |
rb | 只读,二进制 | 以二进制格式打开一个文件用于只读,文件指针将会放在文件的开头 |
r+ | 读写 | 打开一个文件用于读/写 |
rb+ | 读写,二进制 | |
w | 写建 | 打开一个文件用于写入,如果该文件存在,则打开文件;否则,创建新文件 |
wb | 写建,二进制 | 以二进制格式打开一个文件用于写入。 |
w+ | 读写建 | |
wb+ | 读写建,二进制 | |
a | 加建 | 打开一个文件用于追加。如果该文件存在,则文件指针将会放在文件的结尾;否则,创建新文件 |
ab | 加建,二进制 | 以二进制格式打开一个文件用于追加 |
a+ | 读写加建 | 打开一个文件用于读/写。如果该文件存在,则文件指针将会房子啊文件的结尾;否则创建新文件 |
ab+ | 读写加建,二进制 |
以上区别:写与读写,读是确实可以读的,但是读是从指针开始读,所以如果想读取全部内容,需要将指针指向开头
用open()函数打开一个文件,查看返回文件对象的相关信息
file=open(r"./res/QB.png","w")
print("文件名:",file.name)
print("访问模式:",file.mode)
print("是否已关闭:",file.closed)
file.close
print(file)
#
文件名: ./res/QB.png
访问模式: w
是否已关闭: False
<_io.TextIOWrapper name='./res/QB.png' mode='w' encoding='cp936'>
程序运行成功后,在"工作目录/res/"下创建新文件QB.png,如果该文件已经存在,则会覆盖该文件。于是我还要在网上再下载一次这个图片,笑哭!
文件路径“/”等同于“\”,经实验,“\”也行
!!!这里看完之后章节后,再回来看,整理补充下表格
2、with-as语句
在上卖弄代码中,在文件打开或者后面的读、写等操作的过程中都可能发生错误,即使写了关闭文件的语句也不一定能够正常执行,从而导致不能正常关闭文件,缓存信息可能会意外丢失,文件可能会损坏。为了避免发生这种情况,推荐使用Python中的with-as语句,该语句可以避免这种情况的发生。
with-as语句实用于对资源进行访问的场合,可确保不管在使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,如文件使用后自动关闭等。
with open(filename[,mode]) as file:
语句块
其中file为open()函数返回的文件对象。
with-as语句也支持同时打开多个文件用于读写
with open(r"./res/QB.png","w+") as file:
num=file.write("Go Go Go")
print("写入字符%d个"%num)
但,我仅对上面的w+进行了测试,貌似并没有所说的那么强大,只是file.close集成在了这个写法中
当这个方法开始时,文件已经被重建了,只是在完成这个语法块时,会自动file.close而已!
文件操作
在Python中,文本文件的操作(如读、写、关闭等)由文件对象的相关函数完成。
1、写文件
使用函数file.write()或file.writelines()想文件中写入内容
(1)file.write()
向文件中写入字符,并返回写入字符的数目
file.write(str)
with open("Shakespeare.txt","w") as file:
num=file.write("黑夜无论怎样悠长\n白昼总会到来")
print("向文件中写入字符%d个!"%num)
str=input("请输入内容:")
with open("Shakespeare.txt","a") as file:
file.write("\n")
num=file.write(str)
print("向文件中追加字符%d个!"%num)
t=("7234",5678)
with open("77.txt","w") as file:
num=file.write(str(t))
print("写入%d个字符,写入元组成功"%num)
但是这里发生了个问题,第三段代码报错:TypeError: ‘str’ object is not callable
原因是前面将str定义了个变量,所以连续运行下,这里报错的str是一个变凉,而非最初的str()函数
jupyter只能重启服务才能正常运行第三段
为了防止错误,这里我是用s还是str1呢?
(2)file.writelines()
向文件中写入一个字符序列
file.writelines(sequence)
ls={
"但尝不出味道\n","喜欢椰奶,","1","2","3","4"}
with open("77.txt","w") as file:
file.writelines(ls)
print("写入字符序列成功")
#
但尝不出味道
喜欢椰奶,4321
ls={
"A":"a","C":"c","B":"b"}
#
ACB
相比上上段代码,用str(seq),这段代码是吧内容不添加seq标识,挨个打出来的!但注意,元素必须是str,不能是int,如果输入是字典,相当于先执行类似如list()的seq转化方法
书中的例题中,是吧print下载with-as的语句块中的,个人认为不合适,需要写在外面才对,万一执行完print就立刻宕机呢!
2、读文件
从文件中读取内容:file.read()、file.readline()、file.readlines()
(1)file.read()
读取一个文件的内容,返回一个字符串对象
file.read([size])
size为要读取内容的数目,是一个可选的数字类型参数。
当size被忽略或为负时,则该文件的所有内容都将被读取且返回
这里,当文件是由python创建的,将会以ANSI格式存储,即ASCII+UTF,当读取方式时r,则数目时字符数,当读取方式时rb,数目就是字节数
with open("Shakespeare.txt","r") as file:
s=file.read(17)
print(s)
#
黑夜无论怎样悠长
白昼总会到来
a
with open("Shakespeare.txt","r") as file:
for i in file:
print(i)
#
黑夜无论怎样悠长
白昼总会到来
aliwang
(2)file.readline()
从文件中读取一行,返回一个字符串
file.readline([size])
size为要读取内容的数目,可选
当读取模式时b,支持\n识别
with open("Shakespeare.txt","r") as file:
s=file.readline()
print(s)
#
黑夜无论怎样悠长
他是从当前指针开始读取一行,可选参数也是对于输出中的字符数量来说
若要读取至文件结束,参考后面:搜索:我们已经把提瓦特的生物灭绝了无数次,
(3)file.readlines()
读取并返回该文件中包含的所有行,以字符串列表形式返回
file.readlines([sizeint])
sizeint为要读取的字节数,可选
with open("Shakespeare.txt","r") as file:
s=file.readlines(15)
print(s)
#
['黑夜无论怎样悠长\n', '白昼总会到来\n']
file.read(15)
#
黑夜无论怎样悠长
白昼总会到来
file.read(16)
#
黑夜无论怎样悠长
白昼总会到来
file.readlines(16)
#
['黑夜无论怎样悠长\n', '白昼总会到来\n', 'aliwang']
在read中,16加上了"\n",但在readlines中,16,这个不好解释,毕竟我们真的不知道他的机制,但是可以给自己的概念定义,这个\n属于第三行,或者readlines是从0开始索引的等等,结果就是当16指向行(段落)尾部时,这里会把下一行(段)算进来
with open("Shakespeare.txt","w") as file:
file.write("""黑夜无论怎样悠长
白昼总会到来
aliwang
""")
with open("Shakespeare.txt","r") as fil