缓存IO
前面讲了文件的读写操作,但有时候并不是直接读写文件到文件对象,可以通过一个缓存
StringIO,在内存中读写str
from io import StringIO
f = StringIO()
f.write('hello')
# 5
f.write(' ')
# 1
f.write('world!')
# 6
print(f.getvalue())
#hello world!
while True:
s = f.readline()
if s=='':
break
print(s.strip())
'''
Hello!
Hi!
Goodbye!
'''
因此,基本和文件读写一样,StringIO只能操作str
如果要操作二进制数据,使用ByteIO
from io import ByteIO
f = BytesIO()
f.write('中文'.encode('utf-8))
#6
print(f.getvalue())
#b'\xe4\xb8\xad\xe6\x96\x87'
这是用utf8编码的二进制文件
总结:StringIO和BytesIO 一个重要的作用是做缓存, 将文件缓存在内存中,然后一次性序列化到 磁盘中
操作文件和目录
这个操作还是比较实用,毕竟可以通过python语言进行自动化的文件操作,应用范围较广
import os
os.name 操作系统类型
os.environ.get('PATH') 获取环境变量下的PATH变量
```
C:\Users\Administrator\AppData\Roaming\Python\Python37\site-packages\pywin32_system32;D:\bin;C:\Program Files\Java\jdk1.8.0_281;D:\java\bin;D:\java\jre\bin;D:\maven\apache-maven-3.5.4\bin;C:\Windows\system32;C:\Program Files\Git\cmd;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Users\Administrator\Anaconda3;...
```
文件操作模块
os.path.abspath('.') 查看当前目录的绝对路径
#D:\vscodeBash\CodeBash
pa=os.path.join('D:\vscodeBash\CodeBash','newdir') 拼接新的路径,用于后续创建,查找等操作
os.mkdir(pa) 创建目录
os.rmdir(pa) 删除目录
合并路径时,不要直接拼接字符串,要通过
os.path.join()
函数,这样可以正确处理不同操作系统的分隔符
同理,拆分路径,也不能直接拆字符串,通过os.path.split()
函数,这个函数可以将路径拆成两个部分,后一个是最后一级目录或文件名
os.path.split('D:\vscodeBash\CodeBash')
#('D:\x0bscodeBash', 'CodeBash')
os.path.splitext(('D:\vscodeBash\CodeBash\leetcode\两数之和.py'))
#('D:\x0bscodeBash\\CodeBash\\leetcode\\两数之和', '.py')
另外还有一些储备知识:
os模块:
os.listdir(path) 列出了path路径下的所有文件和目录
os.path.isfile(name) 判定name文件存不存在
os.path.isdir(name)判定name是不是一个目录
os.path.getsize(name) 获得name文件的大小
os.path.getmtime(name) 获得name文件最后修改的时间(时间戳)
time模块:
time模块中时间表现的格式主要有三种:
- timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
- struct_time时间元组,共有九个元素组,将年,月,日,小时,分钟,秒,一周第几日,一年第几日,夏令时等变量组合在一起。
- format time 格式化时间,已格式化的结构使时间更具可读性。包括自定义格式和固定格式。
具体用法见python小demo两个练习
序列化与反序列化
序列化和编码其实意思一样,编码注重过程,用什么规则编码,序列化而是注重结果,要产生什么样的数据,其中最常见的是JSON
格式序列化,JSON非常通用