文件和异常
读写文本文件
读取文本文件时,需要在使用open
函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为'r'
(如果不指定,默认值也是'r'
),然后通过encoding
参数指定编码(如果不指定,默认值是None,那么在读取文件时使用的是操作系统默认的编码),如果不能保证保存文件时使用的编码方式与encoding参数指定的编码方式是一致的,那么就可能因无法解码字符而导致读取失败。下面的例子演示了如何读取一个纯文本文件。
1 def main(): 2 f = None 3 try: 4 f = open('致橡树.txt', 'r', encoding='utf-8') # 注意文件的路径 5 print(f.read()) 6 except FileNotFoundError: # 异常处理 7 print('无法打开指定的文件!') 8 except LookupError: 9 print('指定了未知的编码!') 10 except UnicodeDecodeError: 11 print('读取文件时解码错误!') 12 finally: # filally语句最后一定执行,注意就算使用系统终止语句,他仍执行,因为 13 # 系统终止也算异常 14 if f: 15 f.close() 16 17 18 if __name__ == '__main__': 19 main()
还有一种读取文件方式,使用try with方式则无需手动关闭资源
1 def main(): 2 try: 3 with open('致橡树.txt', 'r', encoding='utf-8') as f: # with 4 print(f.read()) 5 except FileNotFoundError: 6 print('无法打开指定的文件!') 7 except LookupError: 8 print('指定了未知的编码!') 9 except UnicodeDecodeError: 10 print('读取文件时解码错误!')
除了使用文件对象的read
方法读取文件之外,还可以使用for-in
循环逐行读取或者用readlines
方法将文件按行读取到一个列表容器中,代码如下所示。
1 import time 2 3 4 def main(): 5 # 一次性读取整个文件内容 6 with open('致橡树.txt', 'r', encoding='utf-8') as f: 7 print(f.read()) 8 9 # 通过for-in循环逐行读取 10 with open('致橡树.txt', mode='r') as f: 11 for line in f: 12 print(line, end='') 13 time.sleep(0.5) 14 print() 15 16 # 读取文件按行读取到列表中 17 with open('致橡树.txt') as f: 18 lines = f.readlines() 19 print(lines)
注意:当读取模式为 ‘w’时,如果文件不存在,系统会自动创建。其他模式则可能引发异常
读写二进制文件
这里演示复制图片,复制时并不需要建立目标文件,系统会自动创建
1 def main(): 2 try: 3 with open('guido.jpg', 'rb') as fs1: # 注意这里的 rb (r表示读,b表示二进制文件) 4 data = fs1.read() # 系统默认为文本文件,所以读取文本文件时候通常省略 5 print(type(data)) # <class 'bytes'> 6 with open('吉多.jpg', 'wb') as fs2: 7 fs2.write(data) 8 except FileNotFoundError as e: 9 print('指定的文件无法打开.') 10 except IOError as e: 11 print('读写文件时出现错误.') 12 print('程序执行结束.') 13 14 15 if __name__ == '__main__': 16 main()
读写JSON文件
json文件样例
1 { 2 "name": "骆昊", 3 "age": 38, 4 "qq": 957658, 5 "friends": ["王大锤", "白元芳"], 6 "cars": [ 7 {"brand": "BYD", "max_speed": 180}, 8 {"brand": "Audi", "max_speed": 280}, 9 {"brand": "Benz", "max_speed": 320} 10 ] 11 }
json和Python其实是一样的
我们使用Python中的json模块就可以将字典或列表以JSON格式保存到文件中,代码如下所示。
1 import json # 导入json库 2 3 4 def main(): 5 mydict = { 6 'name': '骆昊', 7 'age': 38, 8 'qq': 957658, 9 'friends': ['王大锤', '白元芳'], 10 'cars': [ 11 {'brand': 'BYD', 'max_speed': 180}, 12 {'brand': 'Audi', 'max_speed': 280}, 13 {'brand': 'Benz', 'max_speed': 320} 14 ] 15 } 16 try: 17 with open('data.json', 'w', encoding='utf-8') as fs: 18 json.dump(mydict, fs) # 有时候encoding='utf-8'会出错,删了就可以了 19 except IOError as e: # ensure_ascii=False 解决不出现中文 20 print(e) # json.dumps(mydict,ensure_ascii=False) 21 print('保存数据完成!') 22 23 24 if __name__ == '__main__': 25 main()
json模块主要有四个比较重要的函数,分别是:
dump
- 将Python对象按照JSON格式序列化到文件中dumps
- 将Python对象处理成JSON格式的字符串load
- 将文件中的JSON数据反序列化成对象loads
- 将字符串的内容反序列化成Python对象
一般dump和load一起,dumps和loads一起。注意如果从文件中读取出来的话,type()类型为str,需要用load转换成对象.
dumps和loads同理
读取网络数据
1 import requests # 需要导入requests模块 2 import json 3 4 5 def main(): 6 resp = requests.get('http://api.tianapi.com/guonei/?key=APIKey&num=10') 7 data_model = json.loads(resp.text) # 注意这里反序列化成对象 8 for news in data_model['newslist']: 9 print(news['title']) 10 11 12 if __name__ == '__main__': 13 main()