Python IO编程 02 操作文件和目录、序列化

1 操作文件和目录

import os

# 获取操作系统类型
print(os.name)
# 获取系统的详细信息
print(os.uname()) # 此方法在Windows上不提供
# 获取环境变量
print(os.environ)
# 获取某个指定的环境变量
print(os.environ.get('PATH'))
# 查看当前目录的绝对路径
print(os.path.abspath('.'))
# 在某个目录下创建一个新目录
# 1 首先把新目录的完整路径表示出来
spath=os.path.join('/Users/Mac/mydata','pythonio')
# 2 然后创建一个目录
os.mkdir('/Users/Mac/mydata/pythonio')
# 删除一个目录
os.rmdir(spath)

注意:

  • 在把两个路径合并成一个时,不要直接拼接字符串,要使用os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。
  • 同样,拆分路径时,通过os.path.split()函数
print(os.path.split('/Users/Mac/mydata/iotest.txt'))
# 获取文件的后缀名
print(os.path.splitext('/Users/Mac/mydata/iotest.txt'))
# 结果
('/Users/Mac/mydata', 'iotest.txt')
('/Users/Mac/mydata/iotest', '.txt')

过滤文件:

# 列出当前目录下的所有目录
print([x for x in os.listdir('.') if os.path.isdir(x)])
# 过滤出当前目录下的所有py文件
print([x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py'])

2 序列化

>>> import pickle
>>> d=dict(name='lisi',age=20,sex='man')
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00lisiq\x02X\x03\x00\x00\x00ageq\x03K\x14X\x03\x00\x00\x00sexq\x04X\x03\x00\x00\x00manq\x05u.'
>>>
# 把一个对象序列化,并写入文件
>>> f=open('/Users/Mac/mydata/dump.txt','wb')
>>> pickle.dump(d,f)
>>> f.close()
# 反序列化并读取
>>> f=open('/Users/Mac/mydata/dump.txt','rb')
>>> d=pickle.load(f)
>>> f.close()
>>> d
{'name': 'lisi', 'age': 20, 'sex': 'man'}
2.1 JSON

要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。

JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

>>> import json
# 序列化
>>> json.dumps(d)
'{"name": "lisi", "age": 20, "sex": "man"}'
>>>
>>> json_str=json.dumps(d)
# 反序列化
>>> json.loads(json_str)
{'name': 'lisi', 'age': 20, 'sex': 'man'}
# 序列化对象
import json

class Student(object):
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

s = Student('Bob', 20, 88)

# 把对象序列化成json,需要写一个转换函数
def student2dict(std):
    # 返回一个dict
    return {
        'name': std.name,
        'age': std.age,
        'score': std.score
    }

# 序列化对象
print(json.dumps(s, default=student2dict)) # {"name": "Bob", "age": 20, "score": 88}

# 简化写法
print(json.dumps(s, default=lambda obj: obj.__dict__)) # {"name": "Bob", "age": 20, "score": 88}

'''
    反序列化对象,loads()方法首先转换出一个dict对象,
    然后,传入的object_hook函数负责把dict转换为Student实例:
'''

# 转换函数
def dict2student(d):
    return Student(d['name'], d['age'], d['score'])

json_str = '{"age": 24, "score": 85, "name": "lisi"}'
print(json.loads(json_str, object_hook=dict2student)) # <__main__.Student object at 0x1045057b8>

猜你喜欢

转载自blog.csdn.net/lihaogn/article/details/81272048