在用Python进行程序开发时,我们不仅会使用代码,更要读取一些文件,来获取其中的信息。
文件是信息的集成者,有其相应的文件系统,在了解Python如何操作文件时,我们先来了解一下,文件的基础——文件系统。
文件系统是一种用于向用户提供底层数据访问的机制。
它是数据的组织者和提供者。
它的底层,可以是磁盘,也可以是其它动态生成数据的设备比如网络设备。
它使得对文件的访问和查找变得简便。
文件系统中采用文件和树形目录这两个概念代替硬盘和光盘等物理设备使用的数据块的概念
在文件系统中,文件名是用于定位存储位置。
用户使用文件系统时,保存数据不必知晓数据实际保存在硬盘的哪个数据块上。
只需要知道此文件的所属目录和文件名
在写入新数据时,用户不必关心硬盘上的那个块地址是否被使用,硬盘上的存储空间管理功能由文件系统自动完成,用户只需知道数据被写入了哪个文件当中。
文件系统通常使用硬盘之类的存储设备,并维护文件在设备中的物理位置。
不过,文件系统不仅有本地的,也可能仅仅是一种访问数据的界面而已,实际的数据是通过网络协议(如NFS、SMB、9P等)提供的或者内存上。
严格地说,文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型。
在上述的描述中,我们了解了文件系统是怎样组成,运行和定义的。
那么,在Python的程序开发时,是如何运用文件的?请往下看。
Python中有内置的open函数,用这个函数就可以进行一些有关文件的操作,比如说读取文件,改写文件,转译文件。具体的操作字符如下:
'r'读取#read
'w'写入#write 截断之前的文本,
'x'写入#存在已知文本会出现Error
'a'追加#add 将内容写入到已有文件的末尾
'b'二进制模式
't'文本模式
'+'更新#可读可写
在读取文件时,用 open 函数指定特定路径的文件,并将文件模式设置为‘r’来进行读取,然后通过encoding指定编码模式,然后就可以进行读写文件,具体实例如下。
def main():
f =open('青年学记.txt','r',encoding='utf-8')
print(f.read())
f.close()
if __name__ == '__main__':
main()
在上述代码里,如果不指定 encoding编码的话,默认编码是None ,也就是采用操作系统默认的编码。但是,若文件的编码模式与系统的编码模式不同的话,就会出现错误。也就会出现无法解码字符而导致读写失败的错误情况。
同样,若是open 读取的文本不存在,那么也会出现错误,导致程序无法运行。
在程序运行中,在读取外界文件时,总会出现一些错误,如果在程序开发之前没有把这些情况考虑在内,就会出现程序不知如何运行而崩溃的最坏情况。
为了处理这些情况,我们可以先把这些错误下的,输出结果进行了解,然后在代码中把这些结果进行添加和处理,从而避免出现程序崩溃这种情况发生。
读取文件时发生的错误结果,大多为三种
FileNotFoundError#文件不存在
LookupError#未知的编码
UnicodeDecodeError#解码错误
在知晓这些错误状况后,就可以针对这些错误结果,用前面所学过的知识进行固定的输出结果,防止程序崩溃。为了达成此结果,我们要先了解一下 try 代码块 和 except finally代码块。
因为错误状态不同于普通的输出结果,所以需要用try 代码块作为开头,在其下以except 来获取错误状态,来决定输出相应的结果。最后用 finally 代码块来关闭打开的文件,释放掉程序中的外部资源。
具体代码如下:
def main():
f = None
try:
f =open('青年学记.txt','r',encoding='utf-8')
print(f.read())
except FileNotFoundError:
print('文件不存在')
except LookupError:
print('未知的编码')
except UnicodeDecodeError:
print('解码错误')
finally:
if f:
f.close()
if __name__ == '__main__':
main()
像上面这样的,程序对于错误的状态就有一定的抵抗力,会输出相应的指示,而不是直接崩溃。
在读取操作中,如果需要一行一行的来进行读取,可以使用以前学过的for-in循环或者readlines来进行处理。
具体代码如下:
import time
def main():
# 一次性读取整个文件内容
withopen('青年学记.txt','r',encoding='utf-8') as f:
print(f.read())
# 通过for-in循环逐行读取
withopen('青年学记.txt',mode='r') as f:
forlineinf:
print(line, end='')
time.sleep(0.5)
print()
# 读取文件按行读取到列表中
withopen('青年学记.txt') as f:
lines = f.readlines()
print(lines)
if __name__ == '__main__':
main()
上述所有的代码全是关于读取文件的,如果需要写入文件或者添加文件,具体的操作也是一样的,就是在上述代码中 ‘r’的位置换成其他固定的字符,如‘w’写入,‘a’追加等等。
具体的使用应该视开发中的需求而决定。
如果对文章中的内容有什么困惑的地方,可以在评论区提出自己的问题,学记同大家一起交流,解决各种问题,一起进步。
青年学记 陪伴着各位青年
作者:青年学记一名不断进步的程序猿
一起学习 一起进步
走向自立
领取专属 10元无门槛券
私享最新 技术干货