Skip to main content

CP02第一个组件OS

阅读:-


要想胜任报表编程的工作,首先要能够利用 pyth 的内置组件 OS 实现对文件的管理,今天我们就来看看第一个练习作业吧。

2 第一个组件 os

在日常的工作中我们常常需要通过文件名称,进行字符串判断来筛选文件进行处理下面将第一个用例分析如下:

2.1 用例故事

假设我们有一个财富银行,在银行的一个远端 ATM 机器上,顾客可以存钱(deposit money),取钱(withdraw money),以及转账(transfer between Accounts),详细的用例见下图。

1587269958477

图 2-1 经典的用例

用户在 ATM 机器上的每一笔交易,都会留下交易日志,而 ATM 机器会把交易日志保留一个指定目录下, 中心机房需要定期扫描新生成的交易文件,并记录当前的文件列表。

2.1.1 用例描述

下面将相关的用例进行详细描述。

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

[ 扫描文件路径,文件后缀,输出文件路径]

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

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

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

4.应用程序将 list 转换为一个 csv 文件,相关的表头数据包括:

[文件序号, 文件路径、文件名称,文件类型,站点名称,交易日期,目标表名称]

参考文件样例:G-QLR2019020710-001,CSV 表头的映射规则如下:

1)文件序号:为一个自增加序列;

2)文件路径:来自入参;

3)文件名称:符合后缀要求的文件名称;

4)文件类型: 根据文件名称的首字母判断,如果是 G:类型为 常规交易;如果是 T:类型为 转账交易;

5) 站点名称:截取文件名的第 3-5 个字符;

6)交易时间:截取文件名第 5 个字符之后,以及-符号之前的字符串;

7)目标表名称:根据文件类型判断,如果是 G:目标表为 general ticket;如果是 T,目标表为 transfer ticket;

  1. CSV 的信息行数,和扫描到的文件数量相同。

  2. 应用程序根据入参中的输出文件路径,将生成结果文件,文件名称为 filelist.csv

  3. 应用程序返回程序执行响应 [ 执行结果,输出结果文件信息]

其中执行结果:0 成功

1 失败

输出结果文件信息:提供输出结果文件的决对路径,举例如下:

D:\PAE\filelist.csv

2.1.2 测试数据

本章练习的测试数据是 6 个文件,见下图:

1587270207178

2.2 IPO 分析

2.2.1 输入数据分析(I)

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

[ 扫描文件路径,文件后缀,输出文件路径]

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

2.2.2 处理过程(P)

详细见用例描述。

2.2.3 输出数据(O)

应用程序返回程序执行响应 [ 执行结果,输出结果文件信息]

其中执行结果:0 成功

1 失败

输出结果文件信息:提供输出结果文件的决对路径,举例如下:

D:\PAE\filelist.csv

2.3 用例约束

  1. 请使用 python3 以上版本

    2.请使用组件 os 进行文件信息获取

  2. 其他组件: list, csv

2.4 设计方案简介

2.4.1 设计要点

1.需要保存文件在执行过程中的相关信息结构,详情:[文件序号, 文件路径、文件名称,文件类型,站点名称,交易日期,目标表名称]

2.考虑利用 dict 的 hash 特性进行存储

2.4.2 调用关系

1.创建一个空字典:

2.向字典中赋值

3.将字典写入本地

  1. 代码如下:

1587270602531

2.4.3 流转换

2.4.3.1 Filelist

1587270714811

这里的 list 中有三个元素,每个元素中是一个元组的形态。

1587271168060

2.4.3.2 report

1587271221231

2.4.3.3 report_list

1587271374961

2.4.3.4 file.values()

csv 组件写入本地

1587271408707

写入本地

1587271431865

2.5 设计方案详解

下面我们详细看看相关的详细设计

2.5.1 领域对象模型

1587271530868

图 2-1 领域对象模型设计

从上图可见,以上是相关原型的领域对象模型设计。根据用例的要求,我们需要针对每个文件,识别出多个信息结构, 所以为了方便相关的信息结构的记录,我们就使用 dict{} 的这种结构来管理相关的信息结构。

那么在上图中,主要的信息结构有

  1. filelist[]: 用于记录在特定文件夹下,需要处理的文件清单。

  2. report{}:用于针对 1 个特定的文件,记录识别出文件相关的多个信息结构。

  3. report_list[]: 用于记录多个文件的 report{} 字典,这样你就可以知晓多个文件的相关的信息结构。

2.5.2 关键技能点

下面看看,要解决这个题目,我们需要的技能清单。

实现分支技能点详情简介
OS 扫描/csv 输出1、如何基于 list 创建字典基于 list 来创建字典
2、如何利用 OS 建立文件清单扫描文件清单
3、如何将字典结构输入为 CSV将字典结构输出为 csv
4、字符串 split() 操作提取字符串的信息结构

从上表可见,我们需要掌握以上的知识点,方能够实现本题的操作。

2.5.3 基于 list[]创建字典

主要包含四个要素

2.5.3.1 应用目的

假设我们想从 List 中取出值,一般采用的是迭代或索引,但 list 的索引仅是位置编码如:1、2、3.当数据量与应用需要过于复杂时,往往难以处理,所以我们应用 list 转创建 dict,通过 dict 的 key 精确定位到 value。

2.5.3.2 语法说明

1、 dict(zip(list, list))

2、 {k:v for k, v in zip(list, list)}

3、 dict.fromkeys(list, ”)

2.5.3.3 case 举例

方案一:

keys = [‘a’,‘b’,‘c’,‘d’,‘e’]

values = [1,2,3,4,5]

1、 d = dict(zip(keys, values))

2、d={k:v for k, v in zip(keys, values)}

d 中包含的值输出如下:

{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}

方案二:

file_name = [‘文件序号’, ‘文件路径’, ‘文件名称’, ‘文件类型’, ‘站点名称’, “交易日期”, “目标表名称”]

report = dict.fromkeys(file_name, ”)

report 中包含的值信息如下:

1587271764964

2.5.3.4 应用注意点

两个 list 中的长度与信息的位置,是否对应正确。

2.5.4 利用 OS 模块创建文件清单

2.5.4.1 应用目的

假设我们想打开一个文件,首先需要的是知道文件名称,通常我们是输入文件名称进行打开。但如果文件数量大于 100 个,通常的方案显然是不明智的,所以我们使用 os 组件获取指定目录下所有文件名称,来进行文件的操作。

2.5.4.2 语法说明

os.path.splitext(path)

1587271884825

2.5.4.3 Case 举例

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

# filelist 文件信息结构如下:
[(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')]

2.5.4.4 注意要点

1、 通常与列表列生成式与字典生成式混合使用可以简化代码。

2、 Os.path 内置组件用法较多,本文仅举例了一种,还请详细学习 os 其他用法。

2.5.5 如何将字典结构映射为 csv

2.5.5.1 应用目的

Dict 作为流穿越环节中一种很好的载体,我们可以在转换的过程中一直不断使用,但我们的最终目的是将数据写入本地的 csv 文件,所以将 dict 写入 csv 的方法就尤为重要了。

2.5.5.2 语法说明

  1. dict 使用 csv 组件写入(原生)
w = csv.writer(open(file))

w.writerow(dict.keys())

w.writerow(dict.values())
  1. dict 使用 pandas 写入(pandas)
df_log= pd.DataFrame([dict])

df_log.to_csv()

2.5.5.3 Case 举例

  1. dict 使用 csv 组件写入(原生)
with open( "log.csv", 'a', newline='') as f:

 w = csv.writer(f)

 if file['文件序号'] == 0:

 w.writerow(dict.keys())

 w.writerow(dict.values())
  1. dict 使用 pandas 写入(pandas)
df_log= pd.DataFrame([dict])

df_log.to_csv()

2.5.5.4 注意要点

1、 csv 组件进行写入需考虑头部信息过滤。

2、 pandas 则是用 dict 转化为 df 进行写入。

2.5.6 提取字符串的信息结构

2.5.6.1 应用目的

在数据分析中,我们拿到了一串字符,对字符进行判断筛选过滤组合是数据处理的基础,也在日常的工作中频繁的使用。

2.5.6.2 语法说明

描述

Python split()通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串

语法

split() 方法语法:

str.split(str="", num=string.count(str)).

参数

· str — 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。

· num — 分割次数。默认为 -1, 即分隔所有。

返回值

返回分割后的字符串列表。

2.5.6.3 Case 举例

str = "Line1-abcdef \nLine2-abc \nLine4-abcd";

print str.split( ); # 以空格为分隔符,包含 \n

print str.split(' ', 1 ); # 以空格为分隔符,分隔成两个

以上实例输出结果如下:

['Line1-abcdef', 'Line2-abc', 'Line4-abcd']

['Line1-abcdef', '\nLine2-abc \nLine4-abcd']

2.5.6.4 注意要点

官网意涵:

def split(self, _args, **kwargs): # real signature unknown """ Return a list of the words in the string, using sep as the delimiter string. sep The delimiter according which to split the string. None (the default value) means split according to any whitespace, and discard empty strings from the result. maxsplit Maximum number of splits to do. -1 (the default value) means no limit. """* pass

2.6 总结

以上是第一题的训练,通过本题的训练,我们主要掌握了

1,如何通过 OS 模块来扫描特定目录下的文件清单,并将文件清单传入到一个 list 中。

2,如何根据 list 来创造一个 dict{}

3,如何通过 string 的操作来获取需要的信息结构

4,如何将 dict{} 结构结构,输出为 CSV

分享到微博
Starter
MicroServ
Tutorials
Report
Blog