文件读写
- 使用open()函数得到文件对象,调用read()方法读取,最后完成后务必调用close()方法关闭文件,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。
- 参数’r’读取文本文件,'rb’读取二进制文件。
- read()一次读取文件全部的内容,read(size)每次最多读取size个字节的内容,readline()可以每次读取一行内容,readlines()一次读取所有内容并按行返回list。
- 只要写个read()方法就叫做file-like object。
- 读取文件时open()传入encoding参数用于读取特定编码的文件,比如encoding='gbk’读取gbk编码的文件, encoding='utf-8’读取utf-8编码的文件。
- 遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。遇到这种情况,open()函数还接收一个errors参数,表示如果遇到编码错误后如何处理。最简单的方式是直接忽略,errors=‘ignore’
- 写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。
- 使用with
StringIO和BytesIO
StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口。
StringIO
数据读写不一定是文件,也可以在内存中读写。
StringIO顾名思义就是在内存中读写str
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可,getvalue()方法用于获得写入后的str:
from io import StringIO
f = StringIO()
f.write('hello')
print(f.getvalue()) # hello
也可以用一个str初始化StringIO
f = StringIO('Hello!\nHi!\nGoodbye!')
BytesIO
同理,在内存中读写bytes
from io import BytesIO
f = BytesIO()
f.write('中文'.encode('utf-8'))
print(f.getvalue())
# b'\xe4\xb8\xad\xe6\x96\x87'
目录文件操作
- os.name查看操作系统类型。
- os.environ为环境变量,调用os.environ.get(‘key’)可以获取对应的环境变量。
- 把两个路径合成一个时,不要直接拼字符串,而要通过os.path.join()函数,这样可以正确处理不同操作系统的路径分隔符。
- 同样的道理,要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名。
- os.path.splitext()可以直接让你得到文件扩展名
- shutil模块提供了copyfile()的函数
- 常用方法
# 查看当前目录的绝对路径:
os.path.abspath('.')
# '/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
os.path.join('/Users/michael', 'testdir')
# '/Users/michael/testdir'
# 然后创建一个目录:
os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
os.rmdir('/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')
序列化
- 把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling。
- 把变量内容从序列化的对象重新读到内存里称之为反序列化。
- Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据。
- dumps(obj)序列化成str,dump(obj, f)序列化成file-like object,loads(str)和load(f)反序列化方法与之对应。
- 将类对象json化可以使用default参数将类对象字典化在json序列化
json.dumps(s, default=lambda obj: obj.__dict__)
- 反之如果把序列化的对象反序列化回类对象,定义一个object_hook函数即可
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def dict2student(d):
return Student(d['name'], d['age'], d['score'])
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student))
# <__main__.Student object at 0x10cd3c190>