在Python中,对于多次用到的功能,代码需要不断的优化,采用可扩展和可维护的方式。增加代码的可用性
1.输入数据示例
2.具体代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 | #! /usr/bin
# -*- coding: utf-8 -*-
import random
# 函数名一律小写,如有多个单词,用下划线隔开,私有函数在函数前加一个下划线_
def create_sql_command(filedir, inputfile, tablename, config_string):
""" 创建SQL执行命令脚本 -无返回值void functionn"""
with open(inputfile, mode='r', encoding='utf-8') as fileobj:
# 文件对象提供的 readlines 返回一个列表(list)变量
stringlist = fileobj.readlines()
# 列表[] 变为字符串,列表是可变的 join接收字符串列表并拼接每个元素,
# split将字符串拆成单词列表,list函数将字符串拆成单个字母的列表
outputfile = "/".join([filedir, tablename+'.sql'])
fsavefile = open(outputfile, mode='w', encoding='utf-8')
fsavefile.write("------------------------------------------start---------------------------------- \n")
fsavefile.write(config_string)
# len() 方法返回列表元素个数- len() 方法返回对象(字符、列表、元组等)长度或项目个数
K = len(stringlist)
# 遍历-循环
# enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)
# 组合为一个索引序列,同时列出数据和数据下标,start -- 下标起始位置。
for i, line in enumerate(stringlist, start=1):
print(i)
data = line.split("\t")
student_id = "'" + data[0].strip() + "' as student_id"
# 随机值
grade_code = "'" + str(random.randint(1, 9)) + "' as grade_code"
# 递增值
# grade_code = "'" + str(i) + "' as grade_code"
# 数值型数据的类型
class_id = " 2 as class_id"
update_time = "'" + "2019-05-11 12:00:00" + "' as update_time"
# 创建元组,字段顺序需要和插入放入表顺序一致 ,元组field_set(元素均为字符串)
field_set = (student_id, grade_code, class_id, label_nm,update_time)
# 元组field_set(元素均为字符串)转为字符串
field = ",".join(field_set)
line_sql = "select " + field + "\n"
pure_line_sql = line_sql + " union all "
if 0 < i & i < K-1:
print(pure_line_sql)
fsavefile.write(pure_line_sql)
fsavefile.write("\n")
elif i == K-1:
print(line_sql)
fsavefile.write(line_sql)
fsavefile.write("\n")
fsavefile.write(") t1 \n")
fsavefile.write("------------------------------------------end----------------------------------\n")
fsavefile.close()
# __name__是内置变量
if __name__ == "__main__":
# 需要给出 输入的文件位置,文件名, 表名以及是否是分区表,和分区表的分区字段
file_dir = ''F:/PythonProject/Python/Data'
# 输入文件的名称
filename = 'TestData.txt'
input_file = "/".join([file_dir, filename])
print("输入文件名: " + input_file)
# 变量名尽量小写, 如有多个单词,用下划线隔开,常量采用全大写,如有多个单词,使用下划线隔开
table_name = ''base.example_type_d'
# 分区表 True 以及分区字段 如果不是分区表 则设置 partiton_flag= False
# (0,空字符串,空列表、空字典、空元组、None, False)
partiton_flag = True
partiton_string = " partition(partition_date = '20191007') \n"
# 条件表达式 - 先执行中间的if,如果返回True,就是左边,False是右边。
partiton = partiton_string if partiton_flag is True else " \n"
configString = 'insert into table ' + table_name + partiton + "select * from ( \n"
# 无返回值函数会返回一个特殊值 None
create_sql_command(file_dir, input_file, table_name, configString)
|
3.说明
01.对于会在不同位置多次出现的变量,修改一处,其余部分也会修改,所以,尽量在一处变动,而后续的代码不影响其功能,相同的部分提取出来
本次修改,对于字段只需要修改其定义和在元组中的顺序,把是否是分区的情况提取出来,修改的功能量变小了,有助于提高通用性。
02.关于Python的一些问题,会使用,也要理解背后的原理,能表述出来
with方法打开处理文件帮我我们做了什么?
常规的方法try,except,finally,with 实现了finally中f.close
try..except..else没有捕获到异常,执行else语句
try..except..finally不管是否捕获到异常,都执行finally语句
r、r+、rb、rb+文件打开模式区别
03.随机数
random.randint(a,b),生成区间内的整数
04. r 表示需要原始字符串,不转义特殊字符
引号 否能不带转义显示单、双引号,以及多行的情况 单引号,双引号,三引号以及r