IO编程
文件读写
Python中文件读写语法和C兼容
- 读文件
使用Python内置的open()
函数,传入文件名和标示符:
f = open('/Users/michael/test.txt', 'r') # 'r' 表示读,文件不存在会抛出IOError
print f.read() # 读出文件中的全部内容
f.close() # 关闭文件,文件打开后必须关闭
由于使用try来捕获不可预料的IOError并在finally中关闭文件比较繁琐,使用with
来简化:
with open("file_test.py", 'r') as f:
print f.read() # 一次读取全部文件,适用于小文件
print f.read(10) # 一次读取10字节
print f.readline() # 一次读取一行,读配置文件方便
print f.readlines() # 一次读取全部行并返回按行排列(末尾有'\n')的list
file-like Object
有read()
方法的对象二进制文件
用'rb'
模式打开字符编码
可以先用'rb'
模式打开后再用特定编码解码:
with open("file_test.py", 'rb') as f: # 二进制模式打开文件
print f.read(10)
print f.readline().decode('gbk') # 用GBK编码解码
或者直接用某种编码打开:
import codecs
with codecs.open("file_test.py", 'r', 'gbk'):
print f.readline()
- 写文件
打开文件时使用'w'
、'wb'
方式,使用write()
来写入文件,但文件不一定会立马写入磁盘,只有当flush()
或close()
调用的时候才会确定写入 - 打开模式
r 以读方式打开
w 以写方式打开,打开时会清空文件
a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
+ 以读写模式打开
b 以二进制模式打开
t 以文本方式打开
模式可组合使用
操作文件和目录
- 系统信息及环境变量
import os
print os.name
# print os.uname() # win下没有这个函数
print os.environ # 打印环境变量
print os.getenv('path') # 获取某个环境变量的值
- 操作文件和目录
import os
import shutil
print os.name
# print os.uname() # win下没有这个函数
print os.environ # 打印环境变量
print os.getenv('path') # 获取某个环境变量的值
abspath = os.path.abspath('.') # 查看当前目录的绝对路径,abspath()寻找当前路径下的文件的绝对路径
print abspath
join = os.path.join('.', 'testdir') # 把两个路径合成一个, 可以正确处理不同操作系统的路径分隔符
print join
os.mkdir(join) # 创建目录
os.rmdir(join) # 删除目录
print os.path.split(join) # 把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名
os.rename('file_test.txt', 'filetest.txt') # 对文件重命名
os.remove('filetest.txt') # 删掉文件
shutil.copyfile('file_test.txt', 'filetest.txt') # 复制文件
print [x for x in os.listdir('.') if os.path.isdir(x)] # 列出当前目录下的所有目录
print [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1] == '.py'] # 列出所有的.py文件
Python的os
模块封装了操作系统的目录和文件操作,要注意这些函数有的在os
模块中,有的在os.path
模块中
序列化
我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等
# coding=utf-8
try:
import cPickle as pickle
except ImportError:
import pickle
d = dict(name='Bob', age=20, score=88)
print pickle.dumps(d) # 序列化为字符串
f = open('dump.txt', 'ab+')
pickle.dump(d, f) # 序列化并保存到文件
f.close()
f = open('dump.txt')
d = pickle.load(f) # 从file-like Object对象反序列化
f.close()
print d
- Json
# coding=utf-8
import json
d = dict(name='Bob', age=20, score=88)
json_str = json.dumps(d)
print json_str
json_object = json.loads(json_str)
print json_object
print json_object['name']
class Student(object):
# __slots__ = ('name', 'age', 'score') # 没有定义__slots__时对象内部默认使用dict来保存属性
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def student2dict(student):
return {
'name': student.name,
'age': student.age,
'score': student.score
}
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
s = Student('Bob', 20, 88)
# print json.dumps(s, default=student2dict) # 使用序列化函数
json_str = json.dumps(s, default=lambda obj: obj.__dict__) # 没有定义__slots__时对象内部默认使用dict来保存属性,有__slots__的类无法使用这个特性
print json_str
json_object = json.loads(json_str, object_hook=dict2student)
print json_object