python - 啃书 第九章 文件访问

概述

计算机文件是存储在外部存储器上的数据集合。通常计算机处理的大量数据都是以文件的形式组织存放的,操作系统也是以文件为单位对数据进行管理的。

每个文件都有一个文件名,文件名由基本名和扩展名组成,不同类型的文件扩展名也不相同。
文本文件扩展名.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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值