本篇博客简单记录一下Python 下关于文件读写的操作:
主要介绍文件读写过程中遇到的一下几个函数:
目录
1、open(file, mode='r', encoding=None, errors=None)
2、write(string)
3、readlines()
4、readline()
5、read()
6、文件异常处理
下面通过代码一一演示简单用法:
1、open(file, mode='r', encoding=None, errors=None)
功能:主要作用打开文件返回一个文件描述符、也称文件句柄,在程序中文件操作符就代表了打开的文件,
参数说明:
file: 要操作的文件名
mode: 打开文件的方式,主要使用的有:w:写,若写入的文件不为空吗,则会清空原有内容,再进行写、wb:二进制写、r:读、rb:二进制读文件、a:在原有文件的基础上追加写、不会删除文件原有内容
encoding: 文件编码方式,操作不同格式文件时需要指定,为了方便自己以后对文件的读写,最好每次都加上该参数,可选内容:utf-8、gbk
errors: 错误处理方式,目前我遇到的情况是,当遇到一个文件中有个别字符不能以指定的编码方式解析时(一个文件存在两种编码方式),就会报错;这时需要设置该参数:errors=ignore,忽略编解码错误
2、write(string)
功能:将字符串写入到文件中
参数: 字符串
下面通过代码演示用法:
fw = open("test.txt", "w", encoding="utf-8")
writeLine1 = "---------start--------\n"
writeLine2 = "This is line2\n"
writeLine3 = "\n"
writeLine4 = "This is Line3\n"
writeLine5 = "---------end----------\n"
fw.write(writeLine1)
fw.write(writeLine2)
fw.write(writeLine3)
fw.write(writeLine4)
fw.write(writeLine5)
fw.close()
上述代码以 utf-8的编码方式、以文本写入的形式:w、打开名为test.txt的文件
此时当前文件夹下会多出一个名为test.txt的文件,内容如下:
write() 函数会将给定的字符串原封不动的写入到文件中,所以在写入字符串时,需要自己添加换行符
通过上边程序可以看到在最后我们调用了fw.close(),对文件操作符进行关闭,但是当程序太长时,有可能我们就会忘记调用fw.close(),关闭文件操作符,这时就会导致不可预料的异常发生,如:存在于缓存中的内容不能完整写入到文件、打开过多操作符造成系统资源的浪费,下面介绍另一种文件打开方式,让系统自动调用close()
3、readlines()
with open("test.txt", "r", encoding="utf-8") as fr:
allLines = fr.readlines()
print(allLines)
print("===================================")
for line in allLines:
print(line, end='')
这次文件操作通过with open() as fr: 的形式进行文件操作,通过这种方式就不必手动调用close()
上面代码以utf-8编码方式读取文件test.txt
运行结果如下:
['---------start--------\n', 'This is line2\n', '\n', 'This is Line3\n', '---------end----------\n']
===================================
---------start--------
This is line2
This is Line3
---------end----------
通过运行结果可知:readlines() 会将整个文本内容读取到一个列表中,其中文本的每一行为列表的一个元素
我们通过for循环的形式遍历了整个列表并原样打印出来
但这种文件读取形式会存在一定问题,当文件过大时,会造成瞬时占用大量的内存空间
4、readline()
with open("test.txt", "r", encoding="utf-8") as fr:
line = fr.readline()
while line:
print(line, end='')
line = fr.readline()
readline() 按行读取文件,whlie 判断是否读取到了文件结尾,其中空行是包含换行符的,所以会判断空行不是文件结尾,具体结果如下:
---------start--------
This is line2
This is Line3
---------end----------
5、read()
如果不想按照行的形式对文件进行处理,也可以通过read() 函数指定每次读取的字节数:
with open('test.txt', 'r', encoding='utf-8') as fr:
str_ = fr.read(5)
print(str_)
读取test.txt 的5个字节,结果如下:
-----
6、文件异常处理
with open('test_err.txt', 'r', encoding='utf-8') as fr:
line = fr.readline()
print(line)
print("test for exception")
当我们打开一个不存在的文件 test_err.txt 时,程序会直接报错并且终止运行,结果如下:
FileNotFoundError Traceback (most recent call last)
<ipython-input-26-19f9d771b63d> in <module>()
----> 1 with open('test_err.txt', 'r', encoding='utf-8') as fr:
2 line = fr.readline()
3 print(line)
4
5 print("test for exception")
FileNotFoundError: [Errno 2] No such file or directory: 'test_err.txt'
从结果可以看到程序崩溃,并没有执行 print("test for exception")
如果文件不存在,我们希望程序继续执行而不崩溃,这时就需要对异常进行捕获,python的异常捕获采用try...except 语句,具体用法如下:
try:
with open('test_err.txt', 'r', encoding='utf-8') as fr:
line = fr.readline()
print(line)
except Exception as errors:
print("捕获到文件异常")
print(errors)
print("test for exception")
运行上面程序会产生以下输出:
捕获到文件异常
[Errno 2] No such file or directory: 'test_err.txt'
test for exception
从结果可以发现程序捕获到了文件不存在异常,我们利用print(errors)输出了异常信息,现在程序并没有崩溃,而是执行了print("test for exception"),正常结束