4.1 字符串的语义
在python2 和 python3中,对字符串的语义是有着很大的区别的。
- python2
str:表面上是一个字符串,实际上是一连串的字节。
Unicode:真正意义上的字符串
如果存储文件,必须将Unicode转化成str这样连续的字节,就是将Unicode编码。反过来,读取文件时需要将str解码成Unicode。 - python3
byte:与py2中的str是同一含义。
str:是真正意义上的字符串
在读取、写入文本中,可以在open方法中定义具体的编解码格式。
4.2 设置文件缓冲
在文件内容写入到系统的设备上时,对这些文件进行I\O操作耗时可能会很长,可以使用缓冲区来减少调用时间。文件缓冲区的种类:全缓冲,行缓冲,无缓冲。
全缓冲:当写入缓冲区的大小达到一定限制时,将缓冲区内的数据写入到设备中,缓冲区重新开始缓冲。
行缓冲:在shell等终端设备上,使用的是行缓冲。遇到换行符进行一次输出。
无缓冲:对一些串口来说,无需缓冲区,遇到相关信息直接输出。
在python来说,如何设置缓冲区:
全缓冲:在open函数的buffering设置大于1的整数n,n就是缓冲区的大小;
行缓冲:在open函数的buffering设置等于1;
无缓冲:在open函数的buffering设置0;
4.3 获取文件状态
使用系统os库的stat方法可以获取文件的状态。还有其他方法,例如lstat方法,其与stat区别是,lstat不跟随文件链接。
import os
print(os.stat("D:\workspace\PythonAdvance\chapter3\join_test.py"))
os.stat_result(st_mode=33206, st_ino=1688849860425465, st_dev=217826, st_nlink=1, st_uid=0, st_gid=0, st_size=65, st_atime=1509114824, st_mtime=1509114824, st_ctime=1509114824)
其中st_mode是文件类型,可以通过导入stat模块来解析。
import os
import stat
s = os.stat("D:\workspace\PythonAdvance\chapter3\join_test.py")
print(stat.S_ISDIR(s.st_mode))
False
获取文件的访问权限和可执行权限。
print(stat.S_IXUSR & s.st_mode)
print(stat.S_IRUSR & s.st_mode)
获取文件最后访问时间、获取文件最后修改时间、获取文件最后节点时间。
print(time.localtime(s.st_atime))
print(time.localtime(s.st_ctime))
print(time.localtime(s.st_mtime))
获取文件大小
print(s.st_size)
上面介绍的都是使用os标准库中的常规方法。其实有另外简便的方法,就是使用os.path中封装好的方法。
4.4 使用临时文件
当处理一些采集上来的数据时,这些临时文件如果常驻内存会很占用内存资源,这时,可以通过临时文件的形式。这些临时文件不用命名,也不用手动删除,在关闭之后自动删除掉。。
from tempfile import TemporaryFile, NamedTemporaryFile
f = TemporaryFile()
f.write("adb-------------------------------".encode('utf8'))
f.seek(0)
print(f.read(10))
使用TemporaryFile在文件系统中找不到所创建的临时文件。如果要这个临时文件创建之后能够被找到,就使用NamedTemporaryFile来创建。
g = NamedTemporaryFile()
print(g.name)
C:\Users\HUANGG~1\AppData\Local\Temp\tmpcbe2d6_d
临时文件在关闭之后会自动删除掉,如果不想删除掉,可以在构造器中加入delete=False的参数即可。