溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用python+txt構(gòu)建測(cè)試數(shù)據(jù)

發(fā)布時(shí)間:2020-04-14 02:35:05 來(lái)源:網(wǎng)絡(luò) 閱讀:638 作者:ilanqing 欄目:軟件技術(shù)

一、背景

    有4張表,每張表要插入多條測(cè)試數(shù)據(jù)。如若還有同種需求,于是寫(xiě)了一個(gè)腳本,來(lái)添加數(shù)據(jù)。


二、代碼

#--coding:utf8--
import pymysql


class 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函數(shù)中,只需要指定要讀取的文件,即可快速插入測(cè)試數(shù)據(jù)。

    為了便于構(gòu)造sql語(yǔ)句,定義的數(shù)據(jù)文件格式如下:

`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'


三、遇到的問(wèn)題

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

    原因:文件編碼不是ANSI;

    解決方法:將文件用notepad打開(kāi),另存,編碼設(shè)置為ANSI格式。

  2. 入庫(kù)的中文信息亂碼,顯示為'?'

    原因:在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),未將charset設(shè)置為utf8;

    解決方法:重建數(shù)據(jù)庫(kù),重建表,數(shù)據(jù)庫(kù)和表的charset都設(shè)置為utf8

  3. 如何將sql的values數(shù)據(jù)構(gòu)造成‘(),(),();‘的格式

    解決方法:增加計(jì)數(shù)器,當(dāng)讀取到最后一行時(shí),以‘;’結(jié)尾

  4. 如何通過(guò)讀取一個(gè)文件,同時(shí)獲取要操作的表名稱、列名、values

    解決方法:

    數(shù)據(jù)文件的文件名稱,定義成表名;

    數(shù)據(jù)文件的titile,即第一行內(nèi)容,定義成表的列;

    數(shù)據(jù)文件的內(nèi)容,即第一行之后的內(nèi)容,定義成表的數(shù)據(jù)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI