文件是计算机操作系统管理的具有名字的存储区域。
在python中实现文件的读写操作很简单,只要通过python的内置open函数就可以做到,我们可以指定文件名、操作模式、编码信息等来获得操作文件的对象,接下来就可以对文件进行读写操作了。下表为几种操作模式的表示方法。
操作模式 | 具体含义 |
---|---|
‘r’ | 读取(默认) |
‘w’ | 写入(会先截断之前的内容) |
‘x’ | 写入,如果文件已经存在会产生异常 |
‘a’ | 追加,将内容写入到已有文件的末尾 |
‘b’ | 二进制模式 |
‘t’ | 文本模式 |
‘+’ | 更新(既可读又可写) |
读写文本文件
'''
例1:python中打开一个文本文件
'''
def main():
#f = open('a.txt', 'r', encoding='utf-8')
f = open('a.txt', 'r')
print(f.read())
f.close()
if __name__ == '__main__':
main()
例1为一个读取文本文件的例子,其中使用open函数对带路径(绝对路径和相对路径均可)的文件进行打开,将文件读取模式设为’r’,通过encoding来指定编码。
'''
例2:python中向一个文本文件写入信息
'''
def main():
f = open('a.txt', 'w')
f.write('hello \n')
f.write('my friends \n')
f.close()
if __name__ == '__main__':
main()
对于上面的例1,可能会出现该文件不存在或者别的进程正在使用文件导致文件无法打开的情况,因此,我们在这里要引入异常机质。
'''
例3:向读写文本中引入异常机质
'''
def main():
f = None
try:
f = open('a.txt','r')
print(f.read())
except FileNotFoundError:
print('无法打开指定文件')
except LookupError:
print('指定了未知编码')
except UnicodeDecodeError:
print('读取文件时解码错误')
finally:
if f:
f.close()
if __name__ == '__main__':
main()
一个程序在运行的过程中,可能会遇到很多不可预料的事情,比如对于上面的读取文件的例子,可能会出现不存在该文件,文件的编解码不正确等种种问题,这个时候就需要引入异常机质。我们将运行时可能出现情况的代码放在try代码块中,在try代码块的后面可以跟上一个或多个except来捕获可能出现的异常状况。例如在上面读取文件的过程中,文件找不到会引发FileNotFoundError等。最后我们在finally代码块中关闭打开的文件,释放外部资源,finally代码块无论程序怎样都会正常执行。若不使用finally代码块,也可以通过with关键字指定文件对象的上下文环境并在离开上下文环境时自动释放文件资源,如例4所示。
'''
例4:向读写文本中使用with关键字
'''
def main():
f = None
try:
with open('a.txt','r') as f:
print(f.read())
except FileNotFoundError:
print('无法打开指定文件')
except LookupError:
print('指定了未知编码')
except UnicodeDecodeError:
print('读取文件时解码错误')
if __name__ == '__main__':
main()
除了上面读取文件的方法,还可以使用for-in循环逐行读取或者用readlines方法将文件按行读取到一个列表容器中,如例5。
'''
例5:其他读取文件的方法
'''
import time
def main():
#一次性读取整个文件的内容
with open('a.txt','r') as f:
print(f.read())
# 通过for-in循环逐行读取
with open('a.txt','r') as f:
for line in f:
print(line,end=' ')
time.sleep(0.5)
print()
# 读取文件按行读取到列表中
with open('a.txt') as f:
lines = f.readlines()
print(lines)
if __name__ == '__main__':
main()
下面是一个写文件的小例子,演示了如何将1-9999之间的素数分别写入三个文件中(1-99之间的素数保存在a.txt中,100-999之间的素数保存在b.txt中,1000-9999之间的素数保存在c.txt中)。
'''
例6:写文件的将素数存储在文本文件中
'''
from math import sqrt
def is_prime(n):
#判断素数
assert n > 0 #n assert用于判断一个表达式,在表达式条件为 false 的时候触发异常。
for factor in range(2, int(sqrt(n) + 1)):
if n % factor == 0:
return False
return True if n!=1 else False
def main():
filenames = ('a.txt', 'b.txt', 'c.txt')
fs_list = []
try:
for filename in filenames:
fs_list.append(open(filename,'w'))
for number in range(1,10000):
if is_prime(number):
if number < 100:
fs_list[0].write(str(number) + '\n')
elif number < 1000:
fs_list[1].write(str(number) + '\n')
else:
fs_list[2].write(str(number) + '\n')
except IOError as ex:
print(ex)
print('写文字时发生错误\n')
finally:
for fs in fs_list:
fs.close()
print('操作完成')
if __name__ =='__main__':
main()
读写文本文件
下面的例子是复制图片的一个小例子。
'''
例7:写文件复制一个图片
'''
def main():
try:
with open('123.jpg', 'rb') as fs1:
data = fs1.read()
print(type(data))
with open('456.jpg', 'wb') as fs2:
fs2.write(data) #将data的数据写入到456.jpg中
except FileNotFoundError as e:
print('指定的文件无法打开.')
except IOError as e:
print('读写文件时出现错误.')
print('程序执行结束.')
if __name__ == '__main__':
main()
参考资料:
[1]https://github.com/jackfrued/Python-100-Days
[2]《Python学习手册(第4版)》