利用FME PythonCaller调用7z解压压缩包

利用FME PythonCaller调用7z解压压缩包

一、概述

    在一些项目中有时候需要对文件目录完整性进行检查,而需要检查的数据又是压缩包的形式。我们都知道FME可以直接读取压缩包里的文件,当通过FME FeatureReader转换器去读取路径时,发现压缩包里面的空文件夹读取不出来,就想着去解压,但又不想去解压多个压缩文件,就想通过FME在模板中调用系统命令实现批量解压缩。然后就各种查找网上的资源来实现,比较悲哀的是,我使用的2021(beta21816)版本一直无法实现且不报错(其他版本可以实现Systemcaller)。最后采用PythonCaller调用本地的7z解压缩软件实现批处理的操作。

二、总体思路

    利用FME强大的数据转换功能,借助不同转换器之间的紧密衔接和优化配合,达到将文件夹下不同路径的压缩包批量解压缩的操作,并且提供给模板解压缩后的调用路径。

    此次是在FME PythonCaller中调用的os命令,主要实现代码(需要本机安装有7z解压缩软件)如下:

基本格式:

 

参数说明:

  1. x:表示解压缩,并且使压缩包内的文件所在的目录结构保持不变。如果您希望解压后的所有文件都存放在同一个目录下,则使用e。
  2. path_filename:需要解压缩的文件完整路径,如:“E:\test\XXXX.7z”。
  3. out_folder:要要输出到的文件夹路径,如:“D:\新建文件夹\”。
  4. -o:用于指定输出目录,把压缩包内的文件解压到out_folder目录下。
  5. -aoa:表示直接覆盖现有文件,而没有任何提示。
  6. -aos:跳过现有文件。
  7. -aou:如果相同文件名的文件已存在,将自动重命名解压缩的文件。
  8. -aot:如果相同文件名的文件已存在,将自动重命名现有文件。
  9. -r:列出所包含的项。

三、实现过程

     1、FME中测试批处理代码的可行性

    最初将代码在Pythoncaller中输入固定值测试是否能够实现,于是有了以下版本:

利用FME PythonCaller调用7z解压压缩包_第1张图片

 

    但既然写了,就不能使用固定的模式去填写,就想着动态实现。

在Attributecreator中直接拼接好代码如下:

利用FME PythonCaller调用7z解压压缩包_第2张图片

 

利用FME PythonCaller调用7z解压压缩包_第3张图片

 

    但是当运行时发现,这样写进去的路径在系统命令中仍然无法使用。

利用FME PythonCaller调用7z解压压缩包_第4张图片

 

    然后想着直接写到PythonCaller中,如下:

利用FME PythonCaller调用7z解压压缩包_第5张图片

 

2、FME读取文件夹下的路径

    利用FeatureReader转换器,读取目标文件夹下的文件,获取到完整路径。

利用FME PythonCaller调用7z解压压缩包_第6张图片

 

利用FME PythonCaller调用7z解压压缩包_第7张图片

 

3、FME创建输出路径

    根据设置的参数或者直接在AttributeCreator中直接写成文本路径。

利用FME PythonCaller调用7z解压压缩包_第8张图片

 

4、FME PythonCaller调用

利用FME PythonCaller调用7z解压压缩包_第9张图片

 

    这里就存在一个问题,cmd的赋值中有一对单引号将需要动态输入的参数转换成了字符串,这样就不能获取到动态值,然后就将字段拆分重组:

利用FME PythonCaller调用7z解压压缩包_第10张图片

 

    至此,终于将7z压缩包解压缩完成了。

    同理,修改format后的“.7z”就可以利用7z解压缩软件解压所有支持的格式。如下用7z批处理,解压缩”.rar”文件

利用FME PythonCaller调用7z解压压缩包_第11张图片

 

四、总结

    此次的代码需要调用本地7z.exe文件,路径中Python代码只支持“/”或“\\”。

       最后,个人能力及水平所限,文中难免出现错误,敬请谅解。也更希望各位大佬多多指导,给出建议。FME的世界乐趣多多,望共勉!!!

你可能感兴趣的:(默认分类,FME)