文章目录
  1. 1. 文件读写
    1. 1.1. 二进制文件
    2. 1.2. 字符编码
  2. 2. 写文件
  3. 3. 文件操作
    1. 3.1. 操作文件和目录
  4. 4. 序列化
    1. 4.1. JSON
    2. 4.2. JSON进阶

文件读写

Python内置的open()函数可以传入文件名和标示符打开一个文件对象

1
f = open('./test.txt','r')

r表示读,如果文件不存在open()函数会抛出一个IOError错误
如果文件打开成功,调用read()函数可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示

1
str = f.read()

因为文件对象会占用系统资源,所以使用完毕需要调用close()函数关闭文件
Python引入with语句帮助我们自动调用close方法

1
2
with open('./file','r') as f:
f.read()

read方法可以read(size)每次最多读取size个字节的内容,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list

1
2
for line in f.readlines():
print(line.strip()) # 把末尾的`\n`删掉

二进制文件

读取二进制文件比如图片、视频等,用rb模式打开即可:

1
f = open('./test.jpg','rd')

字符编码

读取非ASCALL编码的文本文件,必须以二进制模式打开,再解码,比如GBK编码的文件

1
2
3
f = open('./gbk.txt','rb')
u = f.read().decode('gbk')
print u

写文件

open函数传入标识符W或者wb表示写文件或写二进制文件

1
2
3
f = open('./test.txt','w')
f.write('Hello,world!')
f.close

也可以使用with语句

1
2
with open('./test.txt','w') as f:
f.write('Hello,world!')

写入特定编码也需要转码

文件操作

要操作文件需要导入Python内置的os模块

1
2
import os
os.name # 操作系统的名字

如果是posix说明系统是LinuxUnix或者Mac OS X,如果是nt就是Windows系统
获取系统详细信息可以调用uname()函数
通过os.environ可以看到系统环境变量的dict
要获取环境变量的某个值可以调用os.getenv()函数

操作文件和目录

  • os.path.abspath(‘.’) # 当前目录的绝对路径
  • os.path.join(‘/User/zoe’,’testDir’) # 合并路径
  • os.path.split(‘/Users/zoe/testDir/file.txt’) # 拆分目录
  • os.path.splitext(‘/path/file.txt’) # 拆分文件扩展名
  • os.mkdir(‘./testdir’) # 创建目录
  • os.rmdir(‘./testdir’) # 删除目录
  • os.rename(‘test.txt’,’test.py’) # 重命名
  • os.remove(‘test.txt’) # 删除文件
    os模块中并没有复制文件可以使用shutil模块提供的copyfile()函数
    1
    2
    3
    4
    #  列出当前目录下的所有子目录
    list1 = [x for x in os.listdir('.') if os.path.isdir(x)]
    # 列出所有py文件
    list2 = [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']

序列化

Python提供了cPicklepickle两个模块来实现序列化,两个模块功能一致,区别在于cPickle是C语言写的,速度快,pickle是纯Python写的,速度慢,用的时候先尝试导入cPickle,如果失败了,再导入pickle

1
2
3
4
try:
import cPickle as pickle
except ImportError:
import pickle

使用pickle.dumps()方法把任意对象序列化成一个str,然后,把str写入文件
也可以使用pickle.dump()直接把对象序列化写入file

1
2
3
4
5
d = dict(name='Bob',age=20,score=88)
str = pickle.dumps(d)
f = open('dump.txt','wb')
pickle.dump(d,f)
f.close()

反序列化是用pickle.loads()方法通过读取到字符串反序列化出对象,也可以直接用pickle.load()方法从file中直接反序列化出对象

1
2
3
f = open('dump.txt','rb')
d = pickle.load(f)
f.close()

Pickle的缺点很明显,只能用于Python并且可能不同版本的Python批次都不兼容

JSON

JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

JSON类型 Python类型
{} dict
[] list
“string” str或u”unicode”
1234.56 int或float
true/flase True/False
null None

Python内置的json模块提供了完善的Python对象到JSON格式的转换

1
2
3
import json
d = dict(name='Bob',age=20,score=88)
json.dumps(d) # '{"age": 20, "score": 88, "name": "Bob"}'

同样dump()方法可以直接把JSON写入文件,loads()load()方法可以把反序列化

JSON进阶

对象序列化,需要实现一个转换函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import json
class Stundent(object):
def __init__(self,name,age,score):
self.name = name
self.age = age
self.score = score

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

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

json.dumps(s,default=student2dict) # 先被student2dict转换成dict在顺利序列化为JSON

通常class实例都有一个__dict__属性,用来存储实例变量,所以也可以这么写:

1
json.dumps(s,default=lambda obj:obj.__dict__)

反序列化时

1
2
3
4
def dict2student(d):
return Student(d['name'],d['age'],d['score'])

json.loads(json_str,object_hook=dict2student)

文章目录
  1. 1. 文件读写
    1. 1.1. 二进制文件
    2. 1.2. 字符编码
  2. 2. 写文件
  3. 3. 文件操作
    1. 3.1. 操作文件和目录
  4. 4. 序列化
    1. 4.1. JSON
    2. 4.2. JSON进阶