Python学习笔记——IO编程

来源:互联网 发布:东华大学数据库 编辑:程序博客网 时间:2024/04/29 18:38

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431917590955542f9ac5f5c1479faf787ff2b028ab47000


闲置了有点久,继续学习廖雪峰老师的Python课程,下面是关于IO编程的学习笔记。


1. 读文件

open()函数可以打开一个文件,参数是文件名、标示符、字符编码、遇到错误的处理方式。

标示符:'r'表示读,'w'表示写,'b'表示二进制,搭配使用,如'rb'。

字符编码:可选,如encoding='utf-8',encoding='gbk'。

错误处理:可选,最简单的方法是直接忽略,errors='ignore'。

当文件不存在时,会抛出IOError的错误。

read()方法可以一次读取文件的全部内容,放到内存中,以str对象表示。

如果文件太大,可反复调用read(size)方法,每次读取size个字节的内容。也可以调用readline()方法每次读取一行内容。readlines()方法一次读取所有内容,并按行返回list。

文件使用完毕后一定要关闭,close()方法可以关闭文件。为了保证是否出错都能正确关闭文件,可以使用try...finally来实现:

try:    f = open('/path/to/file', 'r')    print(f.read())finally:    if f:        f.close()

每次这么写有些繁琐,可以使用with语句,来自动帮助调用close()方法:

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


2. file-like Object

像open()函数返回有read()方法的对象,在Python中称为file-like Object,除了file外,还有内存的字节流、网络流、自定义流等等。file-like Object不要求从特殊类继承,只要写个read()方法就成。

StringIO就是在内存中创建的file-llke Object,常用作临时缓冲。


3. 写文件

可以反复调用write()来写入文件。写文件时操作系统往往不会立刻写入到磁盘,而是放到内存缓存起来,只有调用close()方法时才能保证数据全部写入磁盘。这里同样可以使用with语句。


4. StringIO

StringIO是在内存中读写str。

读写事例:

from io import StringIOf = StringIO()f.write('hello')print(f.getvalue())f = StringIO('Hello\nPython\nGoodbye!')while True:    s = f.readline()    if s == '':        break    print(s.strip())


5. BytesIO

要操作二进制数据,使用BytesIO。

使用方法和StringIO类似:

from io import BytesIOf = BytesIO()f.write('中文'.encode('utf-8'))print(f.getvalue())f = BytesIO(b'\xe4\xb8\xad\xe6\x96\x87')f.read()


6. 文件和目录

Python内置的os模块可以直接调用操作系统提供的接口函数。

os.name返回操作系统类型,返回posix表示是Linux、Unix或Mac OS X,返回nt表示是Windows系统。

os.uname()可以获取详细系统信息。该函数在Windows系统上不提供。

os.environ显示环境变量,要获取某个变量的值,可以os.environ.get('key')。

os.path.abspath('.')获取当前目录的绝对路径。

os.path.join('/tmp', 'testdir')拼接目录。

os.mkdir('/tmp/testdir')创建目录。

os.rmdir('/tmp/testdir')删除目录。

os.path.split('/tmp/testdir/test.txt')把路径拆分成两部分,后一部分总是最后级别的目录或文件。

os.path.splitext('/tmp/testdir/test.txt')把路径拆分成两部分,后一部分是文件的扩展名(.txt),如果没有,则是空串。

os.listdir('.')列出指定目录下的所有文件和目录。

os.path.isdir('/tmp')判断是否为目录。

os.path.isfile('/tmp')判断是否为文件。

os.rename('origin', 'new')文件重命名。

os.remove('test.txt')删除文件。

复制文件的功能在os模块中并不存在,可以使用shutil模块,提供了copyfile()的函数,还有其他很实用的函数,可以当做os模块的补充:

from shutil import copyfilecopyfile('from.jpg', 'dest.jpg')


7. 序列化

把变量从内存中变为可存储或传输的过程称为序列化,在Python中叫pickling。

反过来,把变量内容从序列化的对象重新读到内存称为反序列化,在Python中叫unpickling。

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

pickle.dumps()方法把任意对象序列化成一个bytes,然后可以把这个bytes写入文件。或者使用带二个参数的dump()方法直接把对象写入file-like Object。

pickle.loads()方法可以把一个序列化的对象bytes反序列化出对象。也可以直接使用pickle.load()方法从一个file-like Object中直接反序列化出对象。

Pickle只能用于Python,且可能存在兼容性问题,只能保存不重要的数据。


8. JSON序列化

跨语言的序列化可以使用json。

Python内置的json模块提供了支持。

json.dumps()方法将对象序列化,返回一个str,内容是标准的JSON。也可以使用带二个参数的dump()方法直接把对象写入file-like Object。可选参数default用来定义对象序列化的方式。(把任意class变为dict:lambda obj: obj.__dict__,通常class的实例都有一个__dict__属性,是一个dict,用来存储实例变量。也有少数例外,如定义了__slots__的类)

json.loads()方法将JSON反序列化为对象。也可以使用load()方法从一个file-like Object中直接反序列化。可选参数object_hook用来定义对象反序列化的方式。


1 0