编辑一个数据包
在 Quilt 中,数据以数据包data packages.的形式组织。数据包是一组文件、目录和元数据的逻辑集合。
A data package is a logical group of files, directories, and metadata.
初始化一个包
要编辑一个新的空包,使用包的构造函数:
import quilt3
p = quilt3.Package()
要编辑一个预先存在的包,首先确保安装了该包:
import quilt3
quilt3.Package.install(
"examples/hurdat",
"s3://quilt-example",
)
使用 browse 命令来浏览并编辑包:
p = quilt3.Package.browse('examples/hurdat')
向包中添加数据
使用 set 和 set_dir 命令分别将单个文件和整个目录添加到包中:
import quilt3
from pathlib import Path
from os import chdir
TEST_DIR = "test_workflow"
SUB_DIR = "subdir"
# 创建测试目录
Path(TEST_DIR).mkdir(exist_ok=True)
Path(TEST_DIR, SUB_DIR).mkdir(exist_ok=True)
chdir(TEST_DIR) # 如果在 Jupyter 中,可以使用 %cd TEST_DIR/
# 使用 `set` 命令逐个添加条目
# 例如:p.set("foo.csv", "/local/path/foo.csv") 或 p.set("bar.csv", "s3://bucket/path/bar.csv")
# 创建测试数据
with open("data.csv", "w") as f:
f.write("id, value\na, 42")
p = quilt3.Package()
p.set("data.csv", "data.csv")
p.set("banner.png", "s3://quilt-example/imgs/banner.png")
# 或者一次性添加一个目录中的所有内容,使用 `set_dir` 命令
# 例如:p.set_dir("stuff/", "/path/to/stuff/") 或 p.set_dir("things/", "s3://path/to/things/")
# 在包中创建逻辑目录
p.set_dir("stuff/", SUB_DIR)
p.set_dir("imgs/", "s3://quilt-example/imgs/")
以上命令中的第一个参数是逻辑键,它确定文件在包中的位置。因此,运行上述命令后,我们的包将如下所示:
p
(remote Package)
└─banner.png
└─data.csv
└─imgs/
└─banner.png
└─stuff/
第二个参数是物理键,指定文件的实际位置。物理键可以指向本地文件或远程对象(使用 s3:// 路径)。
如果物理键和逻辑键相同,可以省略第二个参数:
import quilt3
p = quilt3.Package()
p.set("data.csv")
(local Package)
└─data.csv
另一个有用的技巧是使用 “.” 将包的内容设置为当前目录的内容:
# 在测试目录中创建一个测试文件
with open("new_data.csv", "w") as f:
f.write("id, value\na, 42")
# 将包的内容设置为当前目录的内容
p.set_dir(".", ".")
(local Package)
└─data.csv
└─new_data.csv
从包中删除数据
使用 delete 命令从包中删除条目:
p.delete("data.csv")
(local Package)
└─new_data.csv
请注意,这只会从包中删除数据条目,而不会删除实际的数据本身。
向包添加元数据
包支持在包的任何位置设置元数据。要在包的条目或目录上设置元数据,请使用 meta 参数:
import quilt3
p = quilt3.Package()
p.set("data.csv", "new_data.csv", meta={"type": "csv"})
p.set_dir("subdir/", "subdir/", meta={"origin": "unknown"})
(local Package)
└─data.csv
└─subdir/
您还可以使用 set_meta 在整个包上设置元数据:
# 在包上设置元数据
p.set_meta({"package-type": "demo"})
(local Package)
└─data.csv
└─subdir/