Skip to main content

CP12文件拷贝之filelist管理

阅读:-


python提供了多样化的数据容器,以便实现报表制作的功能。 而这些数据容器,不但能够制作报表,也可以在一些复杂的环境下,发挥数据缓存的作用,实现相关的弹性的数据计算能力。

12 文件拷贝之filelist管理

12.1 用例故事

在日常的报表处理过程中,我们常常需要将文件从一个路径(source 路径)拷贝到另外一个路径(dest 路径)中,在拷贝的过程中,文件拷贝可能成功也可能失败,所以我们需要记录文件拷贝的详细过程,通常我们会使用一个数据结构 filelist来记录这种文件的拷贝过程。

相关的用例故事为:

1587396231136

1,文件处理器扫描 源文件路径,识别出待转移的文件清单。

2,将待转移的文件清单,拷贝到filelist[]中去。

3, 根据 filelist[]清单,创建一个filelist 的DATA set

4, 根据filelist 顺序执行文件转移拷贝操作。

5,每完成一个文件的操作,更新filelist 的DATA set

主要更新的信息结构见下表:

表 12-1 文件清单的record

序号字段意涵创建时序
1sequence id序列号,自增序列文件拷贝前
2source file path源文件绝对路径文件拷贝前
3file transfer res文件拷贝结果,0 成功,1,失败文件拷贝后
4dest file path目标文件绝对路径文件拷贝后
5file size文件大小文件拷贝后
6file transfer time拷贝完成时间文件拷贝后

虽然这是一个特别小的用例, 但是在大数据处理的过程中,这是一个核心的用例,聪明的你,请好好掌握吧。

12.1.1 用例事件描述

1,用户输入期待扫描的文件路径和文件类型,以及待拷贝的文件路径,相关的信息结构

[ 扫描文件路径,文件后缀,目标文件路径]

举例如下:[D:\PAE, xml ,D:\PAP]

2、应用程序接收到入参以后,首先扫描期待扫描的路径,获取当前文件夹下,所有的文件信息,并保存在list中。

3,应用程序对list进行扫描,识别其中的文件后缀,将符合要求的文件记录保留下来,删除不符合要求的文件记录。

4, 根据待拷贝的文件清单,创建一个filelist 的data set, 包含的信息结构见下表:

序号字段意涵创建时序
1sequence id序列号,自增序列文件拷贝前
2source file path源文件绝对路径文件拷贝前
3file transfer res文件拷贝结果,0 成功,1,失败文件拷贝后
4dest file path目标文件绝对路径文件拷贝后
5file size文件大小文件拷贝后
6file transfer time拷贝完成时间文件拷贝后

5、 应用程序根据待拷贝的文件清单,选择一个文件:

5.1 将文件从源路径拷贝到目标路径(其中目标路径来自入参)

5.2 如果文件拷贝成功,则记录拷贝结果 file transfer res=0, 否则设置为1.

5.3 文件拷贝完成以后,记录文件的拷贝完成时间。

5.4 如果文件拷贝成功以后,获取目标文件的绝对路径。

5.5 如果文件拷贝成功以后,获取目标文件的尺寸

5.6 将 获取的4个信息结构,更新到filelist 的data set中。

6、 全部文件处理完成以后,将filelist 的data set 拷贝到目标文件路径下,文件名称为filelist-res.csv

7, 输出本次用例的执行响应。

包含的信息结构有[ 执行结果,拷贝文件数,文件拷贝日志绝对路径]

其中,执行结果=0 用例执行成功,1 用例执行失败;

拷贝文件数 : 记录本次操作的文件数量

文件拷贝日志绝对路径: 记录文件处理结果的绝对路径

举例为:D:\PAP\filelist-res.csv

12.1.2 IPO 分析

相关的IPO简单说明如下:

12.1.2.1 输入数据分析(I)

用户输入期待扫描的文件路径和文件类型,相关的信息结构

[ 扫描文件路径,文件后缀,目标文件路径]

举例如下:[D:\PAE, xml ,D:\PAP]

12.1.2 .2处理过程(P)

详细见用例描述。

12.1.2.3 输出数据(O)

包含的信息结构有[ 执行结果,拷贝文件数,文件拷贝日志绝对路径]

其中,执行结果=0 用例执行成功,1 用例执行失败;

拷贝文件数 : 记录本次操作的文件数量

文件拷贝日志绝对路径: 记录文件处理结果的绝对路径

举例为:D:\PAP\filelist-res.csv

12.2 设计约束

记录filelist 的data set 基于 pandas df来实现。

12.3 扩展实现1

记录filelist 的data set 基于dict来实现

12.4 设计方案简介

12.4.1 DICT设计方案简介

12.4.1.1 设计要点

1、 文件移动组件的使用

2、 Log的处理方案

12.4.1.2 调用关系

1587396377647

12.4.1.3 流穿越

1.filelist

1587396395274

2.创建空dict

1587396409469

3.向字典中加入值

1587396448436

4.字典转df写入本地

1587396471173

5、生成文件

1587396487328

12.4.2 Pandas方案简介

12.4.2.1 流穿越

1.新建空df

代码:

df = pd.DataFrame([dict.fromkeys(['sequence id',"file_name", 'source file path', 'file transfer res', 'dest file path', 'file size', "file transfer time"],"")])

此处无论是输出字典,列表均可。

1587396535163

2.获取filelist

filelist = [(i, element) for i, element in enumerate(os.listdir(input_path)) if os.path.splitext(element)[1] == ".xml"]

输出如下:

[(0, 'G-QLR2019020710-001.xml'), (1, 'G-QLR2019020710-002.xml'), (2, 'G-QLR2019020710-003.xml'), (3, 'T-QLR2019020710-001.xml'), (4, 'T-QLR2019020710-002.xml'), (5, 'T-QLR2019020710-003.xml')]

3.使用enumerate对filelist迭代

for index, row in enumerate(filelist):

index为:

1587396646402

Row为:

1587396669008

4.通过loc按照上一步迭代的索引进行赋值

此处以 id字段举例

df.loc[index+1, "sequence id"] = row[0]

动态输出如下

1587396713683

5.最终df格式:

1587396729709

6.写入本地:

1587396751801

12.5 Dict方案详解

12.5.1 领域对象模型

1587396785147

图 12-2基于dict的文件记录处理方案

从上图可见,由于在文件的处理过程中需要记录的信息结构比较多,所以需要一个可靠的信息结构来动态增加相关的内容,这里我们就考虑使用了dict{}的方案。

这里也使用了列表生成式,以及相关的for in 循环的控制策略。

12.5.2 关键知识点

文件拷贝filelist之dict方案1、记录文件处理的时间时间函数的应用
2、移动复制文件shutil组件

12.5.3 时间函数的应用

12.5.3.1 应用目的

在本案例中,我们需要记录文件拷贝完成以后的时间,这就是时间函数的管理。

12.5.3.2 语法说明

from datetime import datetime

time_now = "{}".format(datetime.now().strftime('%d%H%M%S'))

12.5.3.3 case举例

1587396850547

1587396874794

1587396910758

1587396957684

参考文献:https://www.cnblogs.com/awakenedy/articles/9182036.html

12.5.3.1 注意事项

需要理解英文意涵,每个单词所代指的时间

12.5.4 移动复制文件-shutil

12.5.4.1 应用目的

通过代码移动复制文件

12.5.4.2 语法说明

1587397002597

12.5.4.3 case举例

  1. shutil.copyfileobj(文件1,文件2):将文件1的数据覆盖copy给文件2。

1587397074158

  1. shutil.copyfile(文件1,文件2):不用打开文件,直接用文件名进行覆盖copy。

1587397100168

3.shutil.copymode(文件1,文件2):之拷贝权限,内容组,用户,均不变。

1587397199161

4.shutil.copystat(文件1,文件):只拷贝了权限。

1587397232527

5.shutil.copy(文件1,文件2):拷贝文件和权限都进行copy。

1587397274262

1587397318356

10.shutil.make_archive():可以压缩,打包文件。

1587397353155

11.shutil.make_archive(base_name, format,…)

1587397375547

1587397399771

shutil对压缩包的处理是调用 ZipFile 和 TarFile两个模块来进行的,详细:

zipfile 压缩解压

1587397507278

tarfile 压缩解压

1587397538125

第二种方法:

1587397552861

解压:

z.extractall(“a”)

12.5.4.4 注意事项

12.6 pands 方案解释

12.6.1 领域对象模型

1587397603410

12.6.1.1 迭代更新

for index, row in enumerate(filelist):

index为:

1587397641822

Row为:

1587397661021

这里 ,row是list中的元组,元组来自于enumerate函数

12.7 总结

透过dict{} 这种数据容器,我们可以动态的记录很多复杂的数据结构,所以认真学习dict{}结构,可以很好的管理一些复杂的应用场景。

分享到微博
Starter
MicroServ
Tutorials
Report
Blog