如何将字符串写入带扩展名的缓冲区以适配要求FilePath的函数?
问题解答
核心结论
直接用StringIO这类内存缓冲区没法直接当作FilePath传入目标函数——因为FilePath本质是文件系统路径对象(一般是pathlib.Path的兼容类型),它的suffix、name属性都是基于真实文件路径的,而内存缓冲区和路径完全是两类东西,不具备这些路径属性。
可行解决方案
根据你的需求,有两种实用的绕开方式:
1. 伪造极简版的FilePath兼容类
既然目标函数只用到了filename的suffix和name两个属性,你可以手写一个极简类模拟这两个属性,直接把需要的后缀信息传进去:
class FakeFilePath: def __init__(self, name, suffix): self.name = name self.suffix = suffix # 比如要模拟名为"data.csv"的文件 fake_path = FakeFilePath(name="data.csv", suffix=".csv") # 直接传入can_parse函数 result = can_parse(fake_path)
这个类不需要实现FilePath的所有方法,只要具备函数用到的两个属性就能通过检查,是最轻量化的方案。
2. 用虚拟内存文件系统(适配需读取内容的场景)
如果后续函数除了检查后缀,还要读取文件内容,可以用pyfakefs库创建虚拟内存文件系统,在里面生成带后缀的文件并写入字符串内容,再用虚拟路径传入:
from pyfakefs.fake_filesystem_unittest import Patcher from pathlib import Path with Patcher() as patcher: # 在虚拟文件系统中创建带后缀的文件并写入内容 patcher.fs.create_file("/tmp/result.json", contents="你的字符串内容") # 用虚拟路径传入函数 result = can_parse(Path("/tmp/result.json"))
这个方案更贴近真实文件场景,但需要额外安装pyfakefs库。
原代码中文翻译
def can_parse(self, filename: FilePath) -> bool: """验证当前实例是否可解析指定文件或目录 :param filename: 待解析的文件/目录路径 :type filename: FilePath :return: 可解析返回True,否则返回False :rtype: bool """ if not filename: return False return (filename.suffix == "" and filename.name in self.suffix_list) or ( filename.suffix in self.suffix_list )
内容的提问来源于stack exchange,提问作者Johan Tuls
相关产品推荐
相关产品推荐

