跳转到主要内容

Kids文件管理库。

项目描述

Latest PyPI version Number of PyPI downloads Travis CI build status Test coverage

这个非常小的模块是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_dirmkdirtouch

>>> 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'), ])

请注意,mkdirtouch都支持一次性处理多个文件。

我们将模拟传统的os.chown来查看底层的操作

>>> import os
>>> import minimock
>>> m = minimock.mock('os.chown')

然后调用用户“root”的kidschown

>>> 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 实验室]

项目详情


下载文件

下载适合您平台文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

kids.file-0.0.7.tar.gz (12.6 kB 查看散列)

上传时间

构建分发

kids.file-0.0.7-py2.py3-none-any.whl (16.8 kB 查看散列)

上传时间 Python 2 Python 3

由以下支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误记录StatusPageStatusPage状态页面