Python--进阶处理5
# 使用路径名来获取文件名,目录名,绝对路径等
import os
path = r'F:\myProject\lean\a'
# Get the last component of the path
basename = os.path.basename(path)
# Get the directory name
dirname = os.path.dirname(path)
print(basename, dirname)
# Join path components together
join_path = os.path.join('aa', 'bb', basename)
print(join_path)
# 展开用户的主目录
expand = os.path.expanduser(path)
print(expand)
# 分离文件扩展名
extension = os.path.splitext(path)
print(extension)
# 测试一个文件或目录是否存在
flag1 = os.path.exists(path)
flag2 = os.path.isfile(path)
flag3 = os.path.isdir(path)
flag4 = os.path.islink(path)
realpath = os.path.realpath(path)
print(flag1, flag2, flag3, flag4, realpath)
# 获取元数据
# 需要考虑文件权限的问题,特别是在获取元数据时候
size = os.path.getsize(path)
ctime = os.path.getmtime(path)
print(size, ctime)
# 获取文件系统中某个目录下的所有文件列表
names = os.listdir(path)
print('-----------------------------------------------------')
def get_all_file(path, list_file):
names = os.listdir(path)
for name in names:
if os.path.isfile(os.path.join(path, name)):
list_file.append(name)
else:
get_all_file(os.path.join(path, name), list_file)
return list_file
print(get_all_file(path, []))
# 对于文件名的匹配,可能会考虑使用glob 或fnmatch 模块
import glob
pyfiles = glob.glob(r'F:\myProject\lean\a\b\*.py')
print(pyfiles)
from fnmatch import fnmatch
pyfiles = [name for name in os.listdir(path) if fnmatch(name, '*.py')]
print(pyfiles)
# 在程序执行时创建一个临时文件或目录,并希望使用完之后可以自动销毁掉
# tempfile 模块中有很多的函数可以完成这任务
# 创建一个匿名的临时文件
from tempfile import TemporaryFile
with TemporaryFile('w+t') as f:
f.write('hello world\n')
f.write('test\n')
f.seek(0)
data = f.read()
# TemporaryFile() 、NamedTemporaryFile() 和TemporaryDirectory() 函数应该
# 是处理临时文件目录的最简单的方式了,因为它们会自动处理所有的创建和清理步骤。
# 在一个更低的级别,你可以使用mkstemp() 和mkdtemp() 来创建临时文件和目录
# 为了获取真实的位置,可以使用tempfile.gettempdir() 函数
# 序列化Python对象
# 将一个Python 对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输它
# 对于序列化最普遍的做法就是使用pickle 模块
import pickle
ob = {"a":1, "b":2, "c":3}
# f = open('E:/1.txt', 'wb')
# pickle.dump(ob, f)
# f.close()
s = pickle.dumps(ob)
print(s)
# 为了从字节流中恢复一个对象,使用picle.load() 或pickle.loads() 函数
f = open('E:/1.txt', 'rb')
data = pickle.load(f)
print(data)
data1 = pickle.loads(s)
print(data, data1)
# 有些类型的对象是不能被序列化的。这些通常是那些依赖外部系统状态的对象,
# 比如打开的文件,网络连接,线程,进程,栈帧等等。用户自定义类可以通过提
# 供getstate () 和setstate () 方法来绕过这些限制
# 用户自定义类可以通过提供getstate () 和setstate () 方法来绕过这些限制。
# 如果定义了这两个方法,pickle.dump() 就会调用getstate () 获取序列化的对象。
# 类似的, setstate() 在反序列化时被调用。