千家信息网

使用python+txt构建测试数据

发表于:2025-01-23 作者:千家信息网编辑
千家信息网最后更新 2025年01月23日,一、背景有4张表,每张表要插入多条测试数据。如若还有同种需求,于是写了一个脚本,来添加数据。二、代码#--coding:utf8--import pymysqlclass InsertTestData
千家信息网最后更新 2025年01月23日使用python+txt构建测试数据

一、背景

有4张表,每张表要插入多条测试数据。如若还有同种需求,于是写了一个脚本,来添加数据。


二、代码

#--coding:utf8--import pymysqlclass InsertTestData(object):    STUDENT_FILE = 'Student.txt'    COURSE_FILE = 'Course.txt'    TEACHER_FILE = 'Teacher.txt'    SCORE_FILE = 'Score.txt'    def __init__(self):        self.connect = pymysql.Connect(            host = 'localhost',            port = 3306,            user = 'root',            # passwd = ' ',            charset = 'utf8'        )        self.database = 'execersise_test'    def read_lines(self, filename):        dict = {}        file_name = filename.split('.')[0]        dict['file_name'] = file_name        with open(filename) as f:            lines = f.readlines()        dict['file_content'] = lines        return dict    def connect_mysql(self):        cursor = self.connect.cursor()        return cursor    def close_mysql(self):        self.connect.close()    def close_curser(self):        self.connect_mysql().close()    def add_test_datas(self, file_obj):        file = file_obj        file_name = file['file_name']        title = file['file_content'][0].strip()        datas = file['file_content'][1:]        content_len = len(datas)        data = ''        counter = 1        for tmpdata in datas:            if counter == content_len:                data += '(' + tmpdata.strip() + ');'            else:                data += '(' + tmpdata.strip() + '),'            counter += 1        sql = 'insert into ' + self.database + '.' + file_name + ' (' + title + ') values '+ data        try:            # self.connect_mysql().executemany(sql)            self.connect_mysql().execute(sql)        except Exception as e:            print('add_' + file_name + ' error: ', e)        self.connect.commit()        self.close_curser()if __name__ == '__main__':    testdata = InsertTestData()    testdata.add_test_datas(testdata.read_lines(InsertTestData.STUDENT_FILE))    testdata.add_test_datas(testdata.read_lines(InsertTestData.TEACHER_FILE))    testdata.add_test_datas(testdata.read_lines(InsertTestData.COURSE_FILE))    testdata.add_test_datas(testdata.read_lines(InsertTestData.SCORE_FILE))

在main函数中,只需要指定要读取的文件,即可快速插入测试数据。

为了便于构造sql语句,定义的数据文件格式如下:

`SID`,`CID`,`Degree` '103' , '3-245' , '86''105' , '3-245' , '75''109' , '3-245' , '68''103' , '3-105' , '92''105' , '3-105' , '88''109' , '3-105' , '76''101' , '3-105' , '64''107' , '3-105' , '91''108' , '3-105' , '78''101' , '6-166' , '85''107' , '6-166' , '79''108' , '6-166' , '81'


三、遇到的问题

  1. UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence

    原因:文件编码不是ANSI;

    解决方法:将文件用notepad打开,另存,编码设置为ANSI格式。

  2. 入库的中文信息乱码,显示为'?'

    原因:在创建数据库时,未将charset设置为utf8;

    解决方法:重建数据库,重建表,数据库和表的charset都设置为utf8

  3. 如何将sql的values数据构造成'(),(),();'的格式

    解决方法:增加计数器,当读取到最后一行时,以';'结尾

  4. 如何通过读取一个文件,同时获取要操作的表名称、列名、values

    解决方法:

    数据文件的文件名称,定义成表名;

    数据文件的titile,即第一行内容,定义成表的列;

    数据文件的内容,即第一行之后的内容,定义成表的数据。

0