使用Robot Framework,我正在尝试使用一个文件和三个包含文件的子目录来压缩目录。我正在使用ArchiveLibrary和关键字在目录中创建Zip From Files。结果是一个压缩目录,其中包含顶层目录中的一个文件和三个空子文件夹。
如何调整库以便包含子文件夹的内容?
这是最初定义关键字的方式:
def create_zip_from_files_in_directory(self, directory, filename):
''' Take all files in a directory and create a zip package from them
`directory` Path to the directory that holds our files
`filename` Path to our destination ZIP package.
'''
if not directory.endswith("/"):
directory = directory + "/"
zip = zipfile.ZipFile(filename, "w")
files = os.listdir(directory)
for name in files:
zip.write(directory + name, arcname=name)
zip.close()
Link到完整的库。
我一直在尝试使用os.walk,但没有成功。
如何在.robot文件中使用关键字:
Zip xml file
${zipfilename}= set variable komplett.zip
Create zip from Files in directory ../xml/komplett/ ${zipfilename}
如果它有所不同,我真的只需要解决这个特定情况,而不是一般情况,这意味着我不介意输入每个目录的路径,然后以某种方式加入,我只是不要了解如何做到这一点...... 另外,我使用PyCharm作为编辑器,而不是RIDE。
答案 0 :(得分:4)
编辑:使用库版本0.4及更高版本时,您可以选择是否应包含子目录。 E.g:
Create Zip From Files In Directory ../xml/komplett/ no_sub_folders.zip
Create Zip From Files In Directory ../xml/komplett/ dir_and_sub_folders.zip sub_directories=${true}
创建tar的关键字有点不同 - 默认情况下它包含子目录中的文件,现在您可以选择不:
Create Tar From Files In Directory ../xml/komplett/ dir_and_sub_folders.tar
Create Tar From Files In Directory ../xml/komplett/ no_sub_folders.tar sub_directories=${false}
默认值sub_directories
基于先前存在的行为,而不是破坏测试用例中现有的用法。
原始答案,版本< 0.4:
如果您愿意修补库,则此代码应执行以下操作:
zip = zipfile.ZipFile(filename, "w")
for path, _, files in os.walk(directory):
for name in files:
file_to_archive = os.path.join(path, name)
# get rid of the starting directory - so the zip structure is top-level starting from it
file_name = path.replace(directory, '')
file_name = os.path.join(file_name, name)
zip.write(file_to_archive, arcname=file_name) # set the desired name in the archive by the arcname argument
zip.close()
编辑:保留 - 子目录中文件的子目录结构。 生成的文件位于顶级目标目录及其所有子目录(位于保留目标目录的完整路径的存档的对面)
arcname
argument controls存档中存储的文件的名称是什么 - 通过第7行,我们保留了相对目录和文件名。
始终使用os.path.join
因为它会自动处理不同文件系统(ntfs / linux / etc)中的差异。
如果最终解决方案适合您,请不要忘记向图书馆老板提出补丁 - 回馈社区:)