python学习(11)文件的读写操作
1.读文件的7种操作模式
操作模式 | 具体含义 |
---|---|
'r' |
读取 (默认) |
'w' |
写入(会先截断之前的内容) |
'x' |
写入,如果文件已经存在会产生异常 |
'a' |
追加,将内容写入到已有文件的末尾 |
'b' |
二进制模式 |
't' |
文本模式(默认) |
'+' |
更新(既可以读又可以写) |
2.读取文本文件时,需要在使用open
函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为'r'
(如果不指定,默认值也是'r'
),然后通过encoding
参数指定编码(如果不指定,默认值是None,那么在读取文件时使用的是操作系统默认的编码),如果不能保证保存文件时使用的编码方式与encoding参数指定的编码方式是一致的,那么就可能因无法解码字符而导致读取失败。
def main(): f = open('123.txt','r',encoding='utf-8') print(f.read()) f.close() if __name__ == '__main__': main()
3.防止读写异常
将那些在运行时可能会出现状况的代码放在try
代码块中,在try
代码块的后面可以跟上一个或多个except
来捕获可能出现的异常状况。例如在上面读取文件的过程中,文件找不到会引发FileNotFoundError
,指定了未知的编码会引发LookupError
,而如果读取文件时无法按指定方式解码会引发UnicodeDecodeError
,我们在try
后面跟上了三个except
分别处理这三种不同的异常状况。最后我们使用finally
代码块来关闭打开的文件。
def main(): f = None try: f = open('123.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()
4.读取文件的方式
有三种:一次性读取完成;使用for-in按行读取;使用readlines()按行读取到列表中;
使用with open()函数的时候可以不用f.open()函数,因为with open提供了一种自动关闭文件的功能。
import time def main(): # 一次性读取整个文件内容 with open('123.txt',mode='r',encoding='utf-8') as f: print(f.read()) # 通过for-in循环按行读取 with open('123.txt',mode='r',encoding='utf-8') as f: for line in f: print(line,end='') time.sleep(1) print() # 读取文件按行读取到列表中 with open('123.txt',mode='r',encoding='utf-8') as f: lines = f.readlines() print(lines) # with open提供了一种自动关闭文件的功能 if __name__ == '__main__': main()
5.将文本信息写入文件文件,在使用open
函数时指定好文件名并将文件模式设置为‘w'
即可。注意如果需要对文件内容进行追加式写入,应该将模式设置为'a'
。如果要写入的文件不存在会自动创建文件而不是引发异常。下面的例子演示了如何将1-9999之间的素数分别写入三个文件中(1-99之间的素数保存在a.txt中,100-999之间的素数保存在b.txt中,1000-9999之间的素数保存在c.txt中)。
from math import sqrt def is_prime(n): """判断素数的函数""" assert n > 0 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',encoding='utf-8')) 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') elif number <10000: fs_list[2].write(str(number)+'\n') except IOError as ex: print(ex) print('写文件时发生错误!') finally: for fs in fs_list: fs.close() print('操作完成!') if __name__ == '__main__': main()
6.读写二进制文件
示例是一个读图片文件写为一个新的图片文件
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) except FileNotFoundError as e: print('指定的文件无法打开!') except IOError as e: print('读写文件时出现错误!') if __name__ == '__main__': main()
7.关于JSON的读写
json模块主要有四个比较重要的函数,分别是:
dump
- 将Python对象按照JSON格式序列化到文件中dumps
- 将Python对象处理成JSON格式的字符串load
- 将文件中的JSON数据反序列化成对象loads
- 将字符串的内容反序列化成Python对象
序列化(serialization)在计算机科学的数据处理中,是指将数据结构或对象状态转换为可以存储或传输的形式,这样在需要的时候能够恢复到原先的状态,而且通过序列化的数据重新获取字节时,可以利用这些字节来产生原始对象的副本(拷贝)。与这个过程相反的动作,即从一系列字节中提取数据结构的操作,就是反序列化(deserialization)”。
8.写一个json文件
import json def main(): mydict = { 'name': '马文飞', 'age': 20, 'qq': 1154196461, 'friends': ['翟华兵', '魏家剑','丁文杰','苏艺','秦旭壮'], 'cars': [ {'brand': 'BYD', 'max_speed': 180}, {'brand': 'Audi', 'max_speed': 280}, {'brand': 'Benz', 'max_speed': 320} ] } try: with open('data.json','w',encoding='utf-8') as fs: json.dump(mydict,fs) except IOError as e: print(e) print('保存数据完成!') if __name__ == '__main__': main()
9.读json文件
import json def main(): try: with open('data.json','r',encoding='utf-8') as fs: temp = json.loads(fs.read()) print(temp) except IOError as e: print(e) if __name__ == '__main__': main()
10.requests模块请求json数据
首先你要申请API
天行数据网址:https://www.tianapi.com/
代码中我自己申请的开封空气质量和开封天气的API,测试很好用,要是报错的话,需要自己申请API网址已给出。
import requests import json def main(): # # 申请了一个查看空气质量的API 天行数据网址:https://www.tianapi.com/ resp = requests.get('http://api.tianapi.com/txapi/aqi/index?key=bcbdd890ed0b7fd449d6de8ebb71d8e0&area=开封') data_model = json.loads(resp.text) print(data_model['newslist']) # 申请了一个查看空气质量的API resp = requests.get('http://api.tianapi.com/txapi/tianqi/index?key=bcbdd890ed0b7fd449d6de8ebb71d8e0&city=开封') data_model = json.loads(resp.text) print(data_model['newslist']) if __name__ == '__main__': main()
运行结果: