Python生成SQL脚本造数据

在Python中,常用到的一些功能,通过具体的小工具,小功能来熟练语言特征,以及常用的解决思路

输入数据示例

student_id  grade_code  class_id
201901      9           1
201902      8           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
#! /usr/bin
# -*- coding: utf-8 -*-


# 函数名一律小写,如有多个单词,用下划线隔开,私有函数在函数前加一个下划线_
def create_sql_command(filedir, inputfile, tablename,outputfile):
""" 创建SQL执行命令脚本 -无返回值void functionn"""
    with open(inputfile, mode='r', encoding='utf-8') as fileobj:
     # with open(filename1, 'rb') as fp1, open(filename2, 'rb') as fp2, open(filename3, 'rb') as fp3:
    # 文件对象提供的 readlines 返回一个列表(list)变量
        stringlist = fileobj.readlines()
        # 列表[] 变为字符串,列表是可变的 join接收字符串列表并拼接每个元素,
        #  split将字符串拆成单词列表,list函数将字符串拆成单个字母的列表 
        fsavefile = open(outputfile, mode='w', encoding='utf-8')
        fsavefile.write("------------------------------------------start---------------------------------- \n")
        config_string = 'insert into  table  ' + tablename + " partition(partition_date = '2019-07-06') \n" \
         + "select * from  ( \n"
        fsavefile.write(config_string)
        # len() 方法返回列表元素个数- len() 方法返回对象(字符、列表、元组等)长度或项目个数
        K = len(stringlist)
        # 遍历-循环
        # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)
        # 组合为一个索引序列,同时列出数据和数据下标,start -- 下标起始位置。
        for i, line in enumerate(stringlist, start=1):
        # # for i, j, k in zip(fp1, fp2, fp3):
            print(i)
            data = line.split("\t")
            # 字符串分隔/读取txt文件时有隐藏换行符,所以使用 .strip()
            student_id = "'" + data[0].strip() + "' as student_id"
            grade_code = "'" + data[1].strip() + "' as grade_code"
            class_id = "'"   + data[2].strip() + "' as class_id"
            linesql = "select " \
            + student_id + ","  \
            + grade_code + ", "\
            + class_id  \
            + "\n"
            purelinesql = linesql + " union all "
            if 0 < i & i < K-1:
                print(purelinesql)
                fsavefile.write(purelinesql)
                fsavefile.write("\n")
            elif i == K-1:
                print(linesql)
                fsavefile.write(linesql)
                fsavefile.write("\n")
    fsavefile.write(") t1 \n")
    fsavefile.write("------------------------------------------end----------------------------------\n")
    fsavefile.close()

# __name__是内置变量 _name__这个系统变量显示了当前模块执行过程中的名称,
# 当该模块被直接执行的时候,__name__ 等于文件名(包含后缀 .py );
# 如果该模块 import 到其他模块中,则该模块的 __name__ 等于模块名称(不包含后缀.py)。而“__main__” 始终指当前执行模块的名称(包含后缀.py)
#  当.py文件被直接运行时,  if __name__ == '__main__'之下的代码块将被运行
#  当.py文件以模块形式被导入时,则为这个模块的名称。不满足 __name__=="__main__" 的条件,因此,无法执行其后的代码。 即if __name__ == '__main__'之下的代码块不被运行。作为模块(也就是库),被其他.py文件导入
# python编译器读取源文件的时候会执行它找到的所有代码,而在执行之前会根据当前运行的模块是否为主程序而定义变量name的值为_main_还是模块名


if __name__ == "__main__":
    filedir = 'F:/PythonProject/Python/Data'
    # 输入文件的名称
    filename = 'TestBaseData_01.txt'
    input_file = "/".join([filedir, filename])
    print("输入文件名: " + input_file)
    # 变量名尽量小写, 如有多个单词,用下划线隔开,常量采用全大写,如有多个单词,使用下划线隔开
    table_name = 'base.example_type_d'
    outputfile = "/".join([filedir, tablename+'.sql'])
    # 无返回值函数会返回一个特殊值 None 函数如果没有写return,默认表示返回 None
    create_sql_command(filedir, input_file, table_name,outputfile)

blogroll

social