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 StringIO
f = 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 BytesIO
f = 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 copyfile
copyfile('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用来定义对象反序列化的方式。