(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