程序和运行时数据是在内存中驻留的,涉及到数据交换的地方,通常是磁盘、网络等,因此需要IO接口。

IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。

CPU和内存的速度远远高于外设的速度。

  • 同步IO
  • 异步IO

操作IO的能力都是由操作系统提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来方便使用。

1. 文件

1.1 读文件

try:
f = open(r'C:\Users\84745\Desktop\test.txt', 'r')
print(f.read())
finally:
if f:
f.close() # 关闭文件

由于反斜杠在Python中被视为转义标记,为在Windows中确保万无一失,应以原始字符串的方式指定路径,即在开头的单引号前加上r

文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。

Python引入了with语句来自动帮我们调用close()方法。

with open(r'C:\Users\84745\Desktop\test.txt') as f:
contents = f.read()
print(contents)
# 逐行读取
filename = 'pi_digits.txt' with open(filename) as f:
for line in f:
print(line)
# 在with代码块外访问文件的内容
filename = 'pi_digits.txt' with open(filename) as f:
lines = f.readlines() for line in lines:
print(line.rstrip())
3.1415926535
8979323846
2643383279

1.2 写文件

写文件和读文件的唯一区别是调用open()函数时,传入标识符'w'或者'wb'表示写文本文件或写二进制文件。

当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。

filename = 'programming.txt'

with open(filename, 'w') as f:
f.write("I love programming.")

1.3 序列化

我们把变量从内存中变成可存储或传输的过程称之为序列化

把变量内容从序列化的对象重新读到内存里称之为反序列化

Python提供了pickle模块来实现序列化。

>>> d = dict(name='Bob', age=20, score=88)
>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()
>>> f = open('dump.txt', 'rb')
>>> d = pickle.load(f)
>>> f.close()
>>> d
{'name': 'Bob', 'age': 20, 'score': 88}

1.3.1 JSON

如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。

Python内置的json模块提供了非常完善的Python对象到JSON格式的转换。

>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d)
'{"name": "Bob", "age": 20, "score": 88}'
>>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'}
import json

class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
} s = Student('Bob', 20, 88)
print(json.dumps(s, default=student2dict)) # {"name": "Bob", "age": 20, "score": 88}

通常class的实例都有一个__dict__属性,它就是一个字典,用来存储实例变量。

import json

class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score s = Student('Bob', 20, 88)
print(json.dumps(s, default=lambda obj: obj.__dict__)) # {"name": "Bob", "age": 20, "score": 88}
# 把JSON反序列化为一个Student对象实例。
import json class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score def dict2student(d):
return Student(d['name'], d['age'], d['score']) json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student)) # <__main__.Student object at 0x00BBAA30>

2. 异常

Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。

2.1 处理异常

如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个Traceback,其中包含有关异常的报告。

异常是使用try-except代码块处理的。

try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!") # You can't divide by zero!

一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。

最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。

try-except语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后。这个子句将在try子句没有发生任何异常的时候执行。

2.2 抛出异常

Python使用raise语句抛出一个指定的异常。

raise唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(即Exception的子类)。


参考资料:

最新文章

  1. ReactJS webpack实现JS模块化使用的坑
  2. SpringMVC学习记录5
  3. Mysql学习笔记(六)增删改查
  4. JavaScript的事件代理(转)
  5. linux SPI bus demo hacking
  6. AWK 脚本编写习惯
  7. Android如何在一个线性布局里完美显示两个listview啊?
  8. winfrom获得鼠标的坐标
  9. rnqoj-82-又上锁妖塔-dp
  10. win8 64位 mysql安装 Configuration file my.ini error code -1
  11. What qualities characterize a great PhD student
  12. Error: theForm.submit is not a function !!
  13. Lintcode--003(乱序字符串)
  14. atomic_compare_exchange
  15. JS学习之prototype属性
  16. c#关于时间TimeHelper类的总结
  17. React Native项目组织结构介绍
  18. SEO高手和SEO屌丝的八个区
  19. CF126B
  20. secureCRT的自动化脚本如何编写?

热门文章

  1. SA的一个辣鸡trick
  2. 关于node.js的进程管理
  3. springboot 中事件监听模型的一种实现
  4. .net mvc数据库操作添加数据的几中方法
  5. jenkins 构建后发送钉钉消息通知(插件)
  6. Kafka(分布式发布-订阅消息系统)工作流程说明
  7. eclipse添加maven环境
  8. NSCache的简单使用
  9. 四则运算C语言程序
  10. &lt;编写有效用例&gt;读书笔记3