由于CUP的运行速度远高于其他外设,IO操作有两种方式:

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

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

  异步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()可以使用:

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入门整理后的笔记

Day-11: IO编程的更多相关文章

  1. Java IO编程全解(四)——NIO编程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7793964.html 前面讲到:Java IO编程全解(三)——伪异步IO编程 NIO,即New I/O,这 ...

  2. Python之IO编程——文件读写、StringIO/BytesIO、操作文件和目录、序列化

    IO编程 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.从 ...

  3. Python之IO编程

    前言:由于程序和运行数据是在内存中驻留的,由CPU这个超快的计算核心来执行.当涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口.由于CPU和内存的速度远远高于外设的速度,那么在IO编程中就存在 ...

  4. 1.Linux标准IO编程

    1.1Linux系统调用和用户编程接口 1.1.1系统调用 用户程序向操作系统提出请求的接口.不同的系统提供的系统调用接口各不相同. 继承UNIX系统调用中最基本和最有用的部分. 调用按照功能分:进程 ...

  5. 06 . Python3入门之IO编程(文件操作)

    IO编程简介 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接口 ...

  6. 面向对象的高级编程&IO编程

    1.给类对象绑定的函数,只对这个对象生效, 而对类绑定的对象, 所有的对象都可以调用. 栗子: def set_score(self, score): self.score = score s.set ...

  7. android 40 Io编程

    Io编程:内存卡和sd卡.字符串存入内存卡然后读出来. activity: package com.sxt.day06_06; import java.io.FileInputStream; impo ...

  8. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  9. Java IO编程全解(一)——Java的I/O演进之路

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7419117.html JDK1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O ...

  10. Java IO编程全解(三)——伪异步IO编程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7723174.html 前面讲到:Java IO编程全解(二)--传统的BIO编程 为了解决同步阻塞I/O面临 ...

随机推荐

  1. mk-js,一个基于react、nodejs的全栈框架

    前言 在这个前端技术爆炸的时代,不自己写套开源框架出门都不好意思跟别人说自己搞前端.去年年初接触的react,16年7月份在github开源了一套针对react.redux探索的项目,近期和伙伴们一起 ...

  2. 微信开发获取用户OpenID

    第一次开发微信版网页,对最重要的获取微信OpenId,特此记录下来 1.首先得有appid和appsecret . public class WeiXin { public static string ...

  3. POJ 2479 Maximum sum 解题报告

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 40596   Accepted: 12663 Des ...

  4. Python查询SQLserver数据库备份(抛砖引玉)

    通过python pymssql直接访问SQLserver数据库,查找其数据库mode,这个脚本具有很强的抛砖引玉特性: 1.可以巡检多台多数据库服务器 2.query内容可以多样化,譬如查询死锁.连 ...

  5. 学习jdbc学习笔记

    1.jdbc: java database connection      jdbc规范:是sun公司制定的一套连接操作数据库的接口.      我们必须要用具体的驱动类去连接操作数据库.    每个 ...

  6. .NET Core 2.0 正式发布信息汇总

    万众瞩目的.NET Core 2.0终于发布了,原定于9.19的dotnetconf大会的发布时间大大提前了1个月,.NET Core 2.0/.NET Standard 2.0的正式发布是.NET ...

  7. layer初步使用

    type:基本层类型 layer提供了5种层类型.可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层). 若你采用layer.open({type: 1})方式 ...

  8. UML类图及依赖,泛化,关联,聚合,组合,实现

    UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...

  9. 再起航,我的学习笔记之JavaScript设计模式10(单例模式)

    单例模式 单例模式(Singleton) : 又被称为单体模式,是只允许实例化一次的对象类.一个类有且仅有一个实例,并且自行实例化向整个系统提供. 命名空间 单例模式可能是JavaScript中我们最 ...

  10. java调用copy复制子文件夹及文件到指定目录(非xcopy)

    因为作所以烦因为烦所以快乐...(为什么不先查一下有没有现成的命令,后悔啊!!) 不知道有xcopy这个命令就自己想写个复制子目录和文件的功能...以下故事诞生了 是这样的,昨天在学校弄的半成品,半成 ...