python学习笔记(9) - IO编程

python学习笔记(九) - IO编程

一. 文件读写:

1. 读文件:

try:
    f = open('D:\\1.txt', 'r') # 读取普通文件
    f = open('D:\\1.jpg', 'rb') # 读取二进制文件
    f.read()
finally:
    if f:
        f.close()

with open('D:\\1.txt', 'r') as f: # 使用with会自动调用close
    for line in f.readlines(): # readlines可以读取一行
        print(line.strip()) # 把末尾的'\n'删掉
        
import codecs
with codecs.open('D:\\1.txt', 'r', 'gbk') as f: # 使用codecs可以指定编码
    for line in f.readlines(): 
        print(line.strip()) 
2. 写文件:
f = open('d:\\1.txt', 'w') # 写二进制位wb
f.write('Hello, world!')
f.close()

二. 操作文件和目录:

python的os模块封装了操作系统的目录和文件操作,要注意这些函数有的在os模块中,有的在os.path模块中

import os

print os.environ # 获取操作系统的环境变量
print os.getenv('PATH') # 获取环境变量中path的值

print os.path.abspath('.') # 查看当前目录的绝对路径
os.mkdir('d:\\test') # 然后创建一个目录
os.rmdir('d:\\test') # 删掉一个目录

print os.path.join('d:\\test', 'tt') # 把两个路径合并成一个 d:\test\tt
print os.path.split('d:\\test\\1.txt') # 拆分路径('d:\\test', '1.txt')
print os.path.splitext('d:\\test\\1.txt') # 获取拓展名 ('d:\\test\\1', '.txt')

三. 序列化

try:
    import cPickle as pickle # 导入cpickle(c语言写的)
except ImportError:
    import pickle # 导入失败就导入pickle(python写的)

d = dict(name='Bob', age=20, score=88)
f = open('d:\\dump.txt', 'wb')
pickle.dump(d, f) # 数据序列化到文件
f.close()

f = open('d:\\dump.txt', 'rb') 
d = pickle.load(f) # 数据反序列化到内存
f.close()
print d

四. JSON:

JSON和python对象之间转换:

import json
d = dict(name='Bob', age=20, score=88)
# 序列化python为JSON格式
print json.dumps(d)  # {"age": 20, "score": 88, "name": "Bob"}

# JSON反序列化成python对象
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print json.loads(json_str) # {u'age': 20, u'score': 88, u'name': u'Bob'}

定制JSON序列化和反序列化:

import json

class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
        
# 定制JSON序列化
def student2dict(std):
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

s = Student('Bob', 20, 88)
print(json.dumps(s, default=student2dict))

# 定制反序列化JSON
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))