zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    一次闲聊
    苏活工厂团队
    《旅游网站针对‘途牛’、‘驴妈妈’的分析报告》
    C# 委托学习
    你进度太慢了
    我一个哥们经典语录
    SharePoint开发学习笔记3——Visual Web Part及自定义配置界面
    Asp.net使用JQuery实现评论的无刷新分页及分段延迟加载效果
    SharePoint开发学习笔记2——对象模型概述
    flash文件转html5工具
  • 原文地址:https://www.cnblogs.com/cherrydream/p/11357417.html
Copyright © 2011-2022 走看看