文件IO open python内置函数,需要手动关闭文件
1 2 3 4 5 6 try : f = open ('/xxxx/xxx/abc.txt' , 'r' ) print (f.read()) finally : if f: f.close()
with…open… 自动关闭文件
1 2 3 4 5 6 with open ('path/to/file' , 'r' ) as f: print (f.read()) for line in f.readlines(): print (line.strip())
file-like object 像open()
函数返回的,有个read()
方法的对象,在python中统称file-like object.除了file,还可以是内存字节流,网络流,自定义流等.file-like object不要求从特定类继承,只要有个read()
方法即可.
二进制文件 要读取二进制文件,比如图片,视频等,用'rb'
模式打开文件即可
1 2 f = open ('path/to/image' , 'rb' ) f.read()
字符编码 1 2 3 f = open ('path/to/gbk' , 'r' , encoding='gbk' , errors='ignore' )
写文件 通过w
或wb
模式来打开文件,表示写入文本文件或二进制文件
1 2 3 4 5 f = open ('path/to/file' , 'w' ) f.write('hello world' ) f.close()
1 2 with open ('path/to/file' , 'w' ) as f: f.write('Hello world' )
StringIO 在内存中读写IO
,就是一种file-like object.要实现在内存中读写,首先要创建一个StringIO
,然后像文件一样写入即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 >>> from io import StringIO>>> f = StringIO()>>> f.write('hello' )5 >>> f.write(' ' )1 >>> f.write('world!' )6 >>> print (f.getvalue()) hello world!from io import StringIO f = StringIO('Hello!\nHi!\nGoodbye!' )while True : s = f.readline() if s == '' : break print (s.strip())
BytesIO StringIO只能操作str
,如果要操作二进制,则要用BytesIO
文件目录操作 os
模块可以直接调用操作系统提供的接口函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import os os.name >>> posix >>> nt os.environ os.environ.get('key' ) os.path.abspath('.' )>>> os.mkdir('/Users/michael/testdir' )>>> os.rmdir('/Users/michael/testdir' ) os.path.join('/Users/michael' , 'testdir' )>>> os.path.join('/Users/michael' , 'testdir' ) os.path.split('/Users/michael/testdir/file.txt' )>>> ('/Users/michael/testdir' , 'file.txt' ) os.path.splitext('path/to/file.txt' )>>> ('/path/to/file' , '.txt' ) os.rename('test.txt' , 'test.py' ) os.remove('test.py' )
复制文件的函数在os模块中并不存在,原因是复制文件并不是由系统提供的系统调用.shutil
模块提供了copyfile()
函数来实现.
shutil可以看作是os的补充
两个例子
1 2 3 4 [x for x in os.listdir('.' ) if os.path.isdir(x)] [x for x in os.listdir('.' ) if ps.path.isfile(x) and os.path.splitext(x)[1 ]=='.py' ]
序列化 变量从内存中变为可存储或传输的过程称为序列化
.
python中叫pickling
,其他语言有不同的称呼,都是一个意思.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import pickle d = dict (name='Bob' , age=20 , score=88 ) pickle.dump(d) f = open ('dump.txt' , 'wb' ) pickle.dump(d, f) f.close() f = open ('dump.txt' , 'rb' ) d = pickle.load(f) f.close()print (d)>>> {name='Bob' , age=20 , score=88 }
JSON 基础 如果我们要在不同的编程语言/程序之间传递对象,就必须把对象序列化为标准格式,业界通用做法就是JSON
.它表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输,还可以直接在web页面中读取,非常方便.
json类型 python类型 {} dict [] list “string” str 1234.56 int或float true/false bool null None
内置json
模块常用方法
1 2 3 4 import json d = dict (name='Bob' , age=20 , score=88 ) json.dumps(d) >>> '{"age": 20, "score": 88, "name": "Bob"}'
方法 作用 dumps() 返回一个字符串,内容就是标准json dump() 直接把python对象序列化成json并写入file-like object loads() 把json反序列化为python对象 load() 直接从file-like object读取字符串并反序列化
JSON进阶 python的class 实例和json也可以序列化和反序列化
绝大部分python的class
的实例都有__dict__
属性,用于保存class
的变量,序列化时可以直接调用,如果不用它则手动写一个转换函数,例如:
1 2 3 4 5 def student2dict (s ): return { 'name' : s.name, 'age' : s.age }
反序列化时需要手动写一个转换函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import jsonclass Student : def __init__ (self, name, age ): self .name = name self .age = age def dict2student (d ): return Student(d['name' ], d['age' ]) s = Student("张三" , 20 ) json_str = json.dumps(s, default=lambda obj:obj.__dict__) json_str = json.dumps(s, default=student2dict) print ('序列化结果:' , json_str) student_object = json.loads(json_str, object_hook=dict2student)print ('反序列化结果:' , student_object.name, student_object.age)