目录
IO编程
-
文件读写
- file-like Object。
open()
函数返回的这种有个read()
方法的对象,在Python中统称为file-like Object,除了file外,还可以是内存的字节流,网络流,自定义流等等 -
# 读文件 with open('/path/to/file', 'r') as f: print(f.read()) #读取二进制文件 f = open('/Users/michael/test.jpg', 'rb') #读取非UTF-8编码的文本文件,比如读取gbk编码的文件 f = open('/Users/michael/gbk.txt', 'r', encoding='gbk') #errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略 f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore') # 写文件,函数传入encoding参数,将字符串自动转换成指定编码,'a'以追加(append)模式 f = open('/Users/michael/test.txt', 'w')
- file-like Object。
-
StringIO和BytesIO
- 内存中读写数据,open是读写文件中的数据
-
from io import StringIO f = StringIO() f.write('hello') #写 seek=5 f.getvalue() #读 f = StringIO('Hello!\nHi!\nGoodbye!') #写 , seek=0 s = f.readline() #读取 # BytesIO 实现了在内存中读写bytes # 第一种方式写入之后,光标变成5了 # 第二种方式光标还是0
-
操作文件和目录
-
操作系统基本信息
-
import os os.name # 操作系统类型,posix,说明系统是Linux、Unix或Mac OS X,如果是nt,就是Windows系统 os.uname() #操作系统详细信息 """ 环境变量 操作系统中定义的环境变量,全部保存在os.environ这个变量 """ os.environ os.environ.get('key')
- 操作文件和目录
-
""" 操作文件和目录的函数一部分放在os模块中,一部分放在os.path模块中 """ os.path.abspath('.') #查看当前目录的绝对路径 # 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来 #两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数, #这样可以正确处理不同操作系统的路径分隔符 os.path.join('/Users/michael', 'testdir') 同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数 os.path.split('/Users/michael/testdir/file.txt') #('/Users/michael/testdir', 'file.txt') os.path.splitext() #可以直接让你得到文件扩展名 os.mkdir('/Users/michael/testdir') # 然后创建一个目录 os.rmdir('/Users/michael/testdir') # 删掉一个目录 # 对文件重命名 os.rename('test.txt', 'test.py') #os不存在复制文件的函数 #但是shutil模块提供了copyfile()的函数,你还可以在shutil模块中找到很多实用函数,它们可以看做是os模块的补充 #过滤文件 [x for x in os.listdir('.') if os.path.isdir(x)]
-
-
序列化
在程序运行的过程中,所有的变量都是在内存中,可以随时修改变量,一旦程序结束,变量所占用的内存就被操作系统全部回收,如果没有把修改后的
'Bill'
存储到磁盘上,下次重新运行程序,变量又被初始化我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上
把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling
-
- Python提供了
pickle
模块来实现序列化 -
import pickle d = dict(name='Bob', age=20, score=88) pickle.dumps(d) #把任意对象序列化成一个bytes,然后就可以把这个bytes写入文件 """ 也可以用pickle.dump()直接把对象序列化后写入一个file-like Object """ f = open('dump.txt', 'wb') d = dict(name='Bob', age=20, score=88) pickle.dump(d, f) f.close() """ 反序列化load,或者用loads从一个bytes中反序列化 """ f = open('dump.txt', 'rb') d = pickle.load(f) f.close()
- Python提供了
-
JSON
- 如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输
-
""" json模块提供了非常完善的Python对象到JSON格式的转换 """ import json d = dict(name='Bob', age=20, score=88) json.dumps(d) # dumps()方法返回一个str,内容就是标准的JSON #类似的,dump()方法可以直接把JSON写入一个file-like Object """ 要把JSON反序列化为Python对象 loads(),把JSON的字符串反序列化, load(), 从file-like Object中读取字符串并反序列化 """ json_str = '{"age": 20, "score": 88, "name": "Bob"}' json.loads(json_str)
-
JSON进阶
dict
对象可以直接序列化为JSON,我们更喜欢用class
表示对象,比如定义Student
类,然后序列化-
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) print(json.dumps(s)) # 报错TypeError,因为Student对象不是一个可序列化为JSON的对象 # 增加可选参数default,把任意一个对象变成一个可序列为JSON的对象 def student2dict(std): return { 'name': std.name, 'age': std.age, 'score': std.score } json.dumps(s, default=student2dict) # 也可以偷懒用lambda, 其中__dict__,用来存储实例变量 json.dumps(s, default=lambda obj: obj.__dict__)