Kids文件管理库。
项目描述
这个非常小的模块是KIDS(Keep It Dead Simple)的一部分,并提出了在非常常见的任务上的一些Python编码快捷方式。我通常快捷的任务需要知道2到10行的Python代码或特殊案例或不同模块的位置。
目前,这是一个非常谦逊的包。
成熟度
此代码处于alpha阶段。尚未在Windows上测试。API可能会更改。这更像是一个正在进行反思的草案。
文档
tmp, get_contents, put_contents
让我们创建一个包含字符串“bonjour”的新临时文件
>>> import kids.file as kf >>> filepath = kf.mk_tmp_file(content='bonjour')
filepath保存临时文件的文件路径。让我们用get_contents检查文件内容
>>> kf.get_contents(filepath) 'bonjour'
现在让我们使用put_contents在这个文件中添加一些新内容
>>> kf.put_contents(filepath, 'hello\nfriend') >>> kf.get_contents(filepath) 'hello\nfriend'
就是这样。
删除文件
要删除文件,您可以使用rm(或rm,它是一个别名)。
此版本的行为与Python rm类似,并添加了一些有用的行为
>>> kf.rm(filepath)
文件已删除。但请注意,如果我们再次尝试
>>> kf.rm(filepath) ## doctest: +ELLIPSIS Traceback (most recent call last): ... FileNotFoundError: [Errno 2] No such file or directory: '...'
为了模仿rm的行为及其-f的使用,您还有一个强制关键字参数,它不会在不存在文件上抛出异常
>>> kf.rm(filepath, force=True)
当它不是“文件未找到”错误时,它将继续抛出异常
>>> kf.rm('/', force=True) Traceback (most recent call last): ... IsADirectoryError: [Errno 21] Is a directory: '/'
当然,还有一个递归参数,用于删除包含所有文件和子目录的目录(就像Unix类似系统的shell中的rm命令一样)
>>> tmp_dirpath = kf.mk_tmp_dir() >>> kf.rm(tmp_dirpath, recursive=True) >>> kf.rm(tmp_dirpath, recursive=True) ## doctest: +ELLIPSIS Traceback (most recent call last): ... FileNotFoundError: [Errno 2] No such file or directory: '...' >>> kf.rm(tmp_dirpath, recursive=True, force=True)
它还支持多个文件
>>> filepath1 = kf.mk_tmp_file() >>> filepath2 = kf.mk_tmp_file() >>> kf.rm([filepath1, filepath2])
当然,它仍然会捕获不良使用,并试图使其清晰
>>> kf.rm(filepath1, foo=True) Traceback (most recent call last): ... TypeError: 'rm' got unexpecteds keywords argument foo
chown, mkdir, touch
提供了一个带有可选recursive关键字参数的chown函数。
现在让我们创建一个小的树形目录(使用mk_tmp_dir,mkdir,touch)
>>> from os.path import join >>> tmp_dirpath = kf.mk_tmp_dir() >>> base = join(tmp_dirpath, 'base') >>> kf.mkdir(join(base, 'foo'), recursive=True) >>> kf.mkdir([join(base, 'foo', 'bar1'), ... join(base, 'foo', 'bar2')]) >>> kf.touch(join(base, 'plop')) >>> kf.touch([join(base, 'foo', 'bar1', 'README'), ])
请注意,mkdir和touch都支持一次性处理多个文件。
我们将模拟传统的os.chown来查看底层的操作
>>> import os >>> import minimock >>> m = minimock.mock('os.chown')
然后调用用户“root”的kids的chown
>>> kf.chown(base, user='root', recursive=True) ## doctest: +ELLIPSIS Called os.chown('.../base/foo', 0, -1) Called os.chown('.../base/foo/bar1', 0, -1) Called os.chown('.../base/foo/bar1/README', 0, -1) Called os.chown('.../base/foo/bar2', 0, -1) Called os.chown('.../base/plop', 0, -1)
如果需要,它支持数字ID
>>> kf.chown(base, gid=0) ## doctest: +ELLIPSIS Called os.chown('.../base', -1, 0)
等同于
>>> kf.chown(base, group='root') ## doctest: +ELLIPSIS Called os.chown('.../base', -1, 0)
当然,你应该避免同时设置uid和user
>>> kf.chown(base, uid=0, user='root') ## doctest: +ELLIPSIS Traceback (most recent call last): ... SyntaxError: uid and user keyword arguments are exclusive.
对group和gid也是一样
>>> kf.chown(base, group='root', gid=0) ## doctest: +ELLIPSIS Traceback (most recent call last): ... SyntaxError: gid and group keyword arguments are exclusive.
你必须至少设置一个组或用户(无论是数字还是非数字)
>>> kf.chown(base) ## doctest: +ELLIPSIS Traceback (most recent call last): ... SyntaxError: No user nor group provided.
让我们清理我们的混乱
>>> minimock.restore() >>> kf.rm(tmp_dirpath, recursive=True)
基本名
有一个完整的基本名实现
>>> kf.basename("/path/foo.bar", ".bar") 'foo' >>> kf.basename("/path/foo.bar") 'foo.bar'
请注意,您可以提供多个后缀
>>> kf.basename("/path/foo.bar", (".foo", ".bar")) 'foo'
只有第一个匹配结尾的才会被删除。
normpath
给定一个路径,它会返回绝对路径
>>> kf.normpath('../tata' , cwd='/tmp/toto') '/tmp/tata'
如果您没有提供cwd参数,它将默认为当前工作目录。
is_empty, exists
给定一个文件路径,它会返回一个布尔值,使用方法相当直接
>>> tmpdir = kf.mk_tmp_dir() >>> foo = os.path.join(tmpdir, "foo") >>> kf.chk.exists(foo) False >>> try: ... kf.chk.is_empty(foo) ... except Exception as e: ... print(str(e)) [Errno 2] No such file or directory: '...foo' >>> kf.touch(foo) >>> kf.chk.exists(foo) True >>> kf.chk.is_empty(foo) True >>> kf.put_contents(foo, "hello") >>> kf.chk.is_empty(foo) False >>> kf.rm(tmpdir, recursive=True)
文件
Python中的文件对象只提供按行读取,这些行由某种原因通过\n(或等效的)分隔。这是相当任意的,因此File是任何文件对象的适配器,以提供基于任何分隔符读取的能力。
为了展示它是如何工作的,我们将使用filify,它接受一个字符串并返回一个包含该字符串的文件对象。(是的,这是StringIO,但增加了对PY3的支持)
>>> from kids.file import File, filify
要使用File,你应该将其用作适配器,这意味着你给它一个文件对象,然后它将返回一个对象,该对象将在其新API和旧API之间建立桥梁
>>> f = File(filify("a-b-c-d"))
因为read提供了一个迭代器,这里有一个方便的函数来获取内容
>>> def show(l): ... print(", ".join(l))
所以这很简单
>>> show(f.read(delimiter="-")) a, b, c, d
这应该适用于非常大的文件或记录,并且对于解析使用NUL分隔字段的文件(如stdout)等,非常有用。
额外的快捷键
我不确定是否保留这些快捷键。我会看看这些是否真的经常使用。
压缩文件
现在你可以轻松地读取它了
>>> filepath = kf.mk_tmp_file(content="foo")
让我们压缩这个文件
>>> zip_filepath = kf.zip(filepath)
这创建了一个新的文件,位于原有文件旁边。让我们检查其内容
>>> kf.get_contents(zip_filepath, uncompress="zlib") 'foo'
现在,我们可以清理我们的混乱
>>> kf.rm(filepath, zip_filepath)
测试
嗯,这个包真的很小,你已经读到了测试。
要执行它们,安装nosetest,然后运行
nosetests
贡献
任何建议或问题都欢迎。拉取请求非常欢迎,请查看指南。
拉取请求指南
您可以发送任何代码。我会查看它,并自己将其集成到代码库中,并保留您作为作者。这个过程可能需要时间,如果您遵循以下指南,它将更快
使用PEP8或pylint检查您的代码。尽量保持80列宽。
按最小的关注点分隔您的提交。
每个提交都应该通过测试(以便容易进行二分查找)
每个功能/错误修复提交应包含代码、测试和文档。
之前的小提交中包含排版或代码美化的更改是受欢迎的。这些应该在提交摘要中使用 !minor 标记。
提交信息应遵循 gitchangelog 规则(检查 git log 以获取示例)
如果提交修复了问题或完成了功能的实现,请在摘要中提及。
如果您对这里未解答的指南有任何疑问,请检查当前的 git log,您可能会找到以前的提交,这些提交会向您展示如何处理您的问题。
许可
版权(c)2019 Valentin 实验室。
根据 BSD 许可证 许可。
变更日志
0.0.6 (2015-03-11)
新增
添加了 is_empty() 和 exists() 快捷方式。 [Valentin 实验室]
0.0.4 (2015-03-04)
新增
几乎所有命令现在都支持文件名列表。 [Valentin 实验室]
0.0.3 (2015-02-06)
新增
添加了 File,可以通过任何字符分隔的块读取文件。 [Valentin 实验室]
标准文件对象的 .read() 方法按行返回内容,但没有其他分隔符可以解析,除了 \n 或等效的。这就是 File 的作用。
添加了支持 cwd 参数的 normpath。 [Valentin 实验室]
basename 现在支持多个后缀。 [Valentin 实验室]
[chk] 添加了快捷方式 is_dir is_file exists。 [Valentin 实验室]
这些只是将它们聚集在 chk 中并重命名以遵循 pep8 规范的方法。
0.0.2 (2015-01-20)
新增
[basename] 添加了对完整基本名的支持(带有后缀删除)。 [Valentin 实验室]
[chown] 按字母顺序遍历并支持仅设置用户或组,并支持数字 ID。 [Valentin 实验室]
API 发生了重大变化,rmtree 现在在 rm 中,zip_file 返回文件名。 [Valentin 实验室]
0.0.1 (2013-02-12)
第一次导入。 [Valentin 实验室]
项目详情
下载文件
下载适合您平台文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。