Python之文件和异常IO

文件和异常

读写文本文件

读取文本文件时,需要在使用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()
原文地址:https://www.cnblogs.com/cherrydream/p/11357417.html