[Python进阶-7]文件和目录的IO操作,以及json序列化和反序列化

(1)文件的基本读写操作
——记住要关闭文件。或者用with来制动完成。
——二进制文件的读取都是在标识符上有变化,比如二进制文件的读取是rb。

>>> f=open('/Users/Andy/test-py/log.txt','r')
>>> f.read()
'INFO:root:INFO HERE\nWARNING:root:WARN HERE\nERROR:root:ERROR HERE\nCRITICAL:root:CRITICAL HERE\n'
>>> f.close()
>>> with open('/Users/Andy/test-py/log.txt','r') as f:
... print f.read()
  File "<stdin>", line 2
    print f.read()
        ^
IndentationError: expected an indented block
>>> with open('/Users/Andy/test-py/log.txt','r') as f:
...     f.read()
... 
'INFO:root:INFO HERE\nWARNING:root:WARN HERE\nERROR:root:ERROR HERE\nCRITICAL:root:CRITICAL HERE\n'
>>> f=open('/Users/Andy/test-py/log.txt','w')
>>> f.write('hello,write it down')
>>> f.close()
>>> f=open('/Users/Andy/test-py/log.txt','r')
>>> f.read()
'hello,write it down'
>>> f.close()

——非ASCII码的文件,也是rb二进制读取,且需要转码:

>>> f = open('/Users/michael/gbk.txt', 'rb')
>>> u = f.read().decode('gbk')
>>> u
u'\u6d4b\u8bd5'
>>> print u
测试

——自动解码用codecs

import codecs
with codecs.open('/Users/michael/gbk.txt', 'r', 'gbk') as f:
    f.read() # u'\u6d4b\u8bd5'

(2)目录和文件的基本操作

#-*-coding:UTF-8-*-

import os

# print os.name
# posix 表示linux等系统名称

# print os.uname()
# 具体系统信息
# ('Darwin', 'wwwdeMacBook-Air.local', '15.0.0', 'Darwin Kernel Version 15.0.0: Wed Aug 26 16:57:32 PDT 2015; root:xnu-3247.1.106~1/RELEASE_X86_64', 'x86_64')

# print os.environ
# 系统环境变量

# print os.getenv('PATH')
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin获取某个环境变量值,如PATH

# print os.path.abspath('.')
# /Users/Andy/test-py当前绝对路径

# print os.path.join(os.getcwd(),'hello')
# /Users/Andy/test-py/hello
# 拼接和拆封路径,最好用函数,因为不同系统分隔符不同,有/和\之分

# os.mkdir(os.path.join(os.getcwd(),'hello'))
# 创建了一个目录

# os.rmdir(os.path.join(os.getcwd(),'hello'))
# 删除一个目录

# print os.path.split('/Users/Andy/test-py/xxx.yy')
# ('/Users/Andy/test-py', 'xxx.yy')
# 总是和最后一部分路径或者文件分割
# 给予的路径不一定要存在,因为这个函数其实相当于在处理字符串

# print os.path.splitext('/hello/hi.py')
# ('/hello/hi', '.py')
# 分割后缀

# os.rename(os.path.join(os.getcwd(),'log.txt'),os.path.join(os.getcwd(),'lognew.txt'))
# 重命名
# 文件不存在时报错 OSError: [Errno 2] No such file or directory

# os.remove(os.path.join(os.getcwd(),'notexist.html'))
# 删除文件
# 文件不存在时报错 OSError: [Errno 2] No such file or directory

# 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]=='.txt']
# 当前目录下txt文件

(3)dump/dumps/load/loads的序列化和反序列化

# -*- coding:UTF-8 -*-
import os
try:
    import cPickle as pickle
except ImportError:
    import pickle

d=dict(name='eric',age=20)
# 用dumps和loads直接序列化成str或反序列化一个str,然后可以写入文件(此处未写入文件)
# temp=pickle.dumps(d)
# print temp
# (dp1
# S'age'
# p2
# I20
# sS'name'
# p3
# S'eric'
# p4
# s.
# s=pickle.loads(temp)
# print s
# {'age': 20, 'name': 'eric'}

# 直接用dump和load写入序列化后写入文件或从文件反序列化
with open(os.path.join(os.getcwd(),'lognew.txt'),'wb') as f:
    pickle.dump(d,f)
# 注意打开方式是wb

with open(os.path.join(os.getcwd(),'lognew.txt'),'rb') as ff:
    s=pickle.load(ff)
    print s

(4)json模块的dumps和loads,转换class实例时需要实现一个方法,类似于OC语言。

# -*- coding:UTF-8 -*-
import json
# print json.dumps(d)
# {"age": 20, "name": "eric"}
# 对象的json序列化

class Student(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return self.name
s1=Student('andy',30)
# print json.dumps(s1)
# 出现错误,因为默认情况下,json的dumps不知道怎么序列化一个class对象

def student2dict(std):
    return {'name':std.name,'age':std.age}

res=json.dumps(s1,default=student2dict)
print res
# {"age": 30, "name": "andy"}这样就可以序列化了

def dict2student(d):
    return Student(d['name'],d['age'])

print json.loads(res,object_hook=dict2student)
# andy
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值