Day-11: IO编程

  因为CUP的运行速度远高于其余外设,IO操做有两种方式:python

  同步IO:CUP登着,程序暂停直到执行完后续代码编程

  异步IO:CUP不等待,去作其余的事情,磁盘作完该作的事情后,告诉CUP,CUP再进行后续代码json

  异步IO操做较为复杂,这里记录同步IO操做。网络

  • 文件读写

  Python中读写文件是经过由操做系统提供的。异步

  读文件:先使用open()方法打开文件,以后使用read()方法读入内存。编程语言

>>> f = open('/Users/michael/test.txt', 'r')
>>> f.read()
'Hello, world!'

  最后,必须close()关闭文件,由于文件对象会占用操做系统的资源。学习

>>> f.close()

  而在其中一旦出了错误,就会抛出IOError,为了保证最后能close(),使用with语句,来代替测试

with open('/path/to/file', 'r') as f:
    print f.read()

  其中,read()一次性读取所有内容,read(size),每次读取size个字节的内容,readline()每次读取一行内容,readlines()一次读取全部内容,每一行都储存在list的一个元素中。编码

对于readlines()可使用:spa

for line in f.readlines():
    print(line.strip()) # 把末尾的'\n'删掉

  凡是可使用open()打开的对象,都是file-like Object。除了file外,还有内存的字节流,网络流,自定义流等。

  普通的文件是以ASCII码编写的,而对于图片,视频等是由二进制文件编写的,得用‘rb’模式打开。

  对于非ASCII编码的文件,必须得由二进制模式打开,再解码。好比GBK编码的文件:

>>> f = open('/Users/michael/gbk.txt', 'rb')
>>> u = f.read().decode('gbk')
>>> u
u'\u6d4b\u8bd5'
>>> print u
测试

这里有简化的方法,利用codecs模块,自动转码

import codecs
with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
    f.read() # u'\u6d4b\u8bd5'

  写文件:写文件与读文件相似,为确保数据所有由内存写入文件,使用with语句

with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

若有特定编码的文本文件,使用codecs模块。

  • 操做文件和目录

   获取环境变量:os.environ

  获取某个环境变量的值:os.getenv(‘PATH’)

  查看当前目录的据对路径:os.path.abspath('.')

  将两个路径拼成一个:os.path.join('/User/michael', 'testdir')

  建立一个目录:os.mkdir('/Users/michael/testdir')

  删除一个目录:os.rmdir('/Users/michael/testdir')

  拆分路径,获得最后一级的文件或目录名:os.path.split('/Users/michael/testdir/file.txt')

  拆分路径,获得文件扩展名:os.path.splitext('/path/to/file.txt')

  文件重命名:os.rename('test.txt', 'test.py')

  删掉文件:os.remove('test.py')

  复制文件:在shutil模块中的copyfile()

  列出当前目录下的全部目录:[x for x in os.listdir('.') if os.path.isdir(x)]

  列出全部的.py文件:[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

  • 序列化

  变量从内存中变成可储存或传输的过程称为序列化,Python中负责序列化的叫作pickle和cPickle。

  pickle和cPickle的区别在于cPickle是用c写的,速度快;pickle是用python写的,速度慢。因此:

try:
    import cPickle as pickle
except ImportError:
    import pickle

  将对象序列化并写入文件:

>>> f = open('dump.txt', 'wb')
>>> pickle.dump(d, f)
>>> f.close()

  将对象从磁盘读到内存,反序列化:

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

  pickle序列化对象后,存储的变量和原来的变量彻底不同,知识内容相同,并且每一个语言序列化后的变量也是不同的。为了在不一样的编程语言间传递对象,必须把对象序列化为标准格式。Python内置的json模块提供了很是完善的Python对象到JSON格式的转换。

{} dict
[] list
"string" 'str'或u'unicode'
1234.56 int或float
true/false True/False
null None

使用json.dump方法

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

相似的,dump()方法能够直接把JSON写入一个file-like Object

JSON反序列化

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

loads()把JSON的字符串反序列化,load()从file-like Object中读取字符串并序列化

将Student实例变成一个JSON对象。

def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

print(json.dumps(s, default=student2dict))

将JSON反序列化为一个Student对象实例

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))

  注:本文为学习廖雪峰Python入门整理后的笔记

相关文章
相关标签/搜索