Программа на Python, вставка TXT-файла в базу данных sqlite3 - PullRequest
1 голос
/ 24 апреля 2019

В настоящее время работает над программой на Python, которая должна взять данные из текстового файла и ввести их в соответствующее место в SQLite. Я создал свою базу данных и столбцы, теперь я застрял в том, как я обрабатываю текстовые данные и считываю их в базу данных sqlite.

Вот пара строк из текстового файла.

Kernel version:            Windows 10 Enterprise, Multiprocessor Free
Product type:              Professional
Product version:           6.3
Service pack:              0

Вот что у меня есть,

import sqlite3                                                      
conn = sqlite3.connect('systeminfo.db')                                    
c = conn.cursor()                       

def create_table():                                                   
    c.execute("""CREATE TABLE IF NOT EXISTS system_information (      
                Machine_Name text,                                    
                Kernel_version text,                                  
                Product_type text,                                    
                product_version text,                                 
                Registered_organization text,                         
                registered_owner text,                                
                system_root text,                                     
                processors text,                                      
                physical_memory text                                  
                )""")                                                 
create_table1()                                                                    

Это создает мою базу данных и мою таблицу именно так, как я хочу, теперь я застрял на том, чтобы взять, например, версию ядра из текстового файла и поместить «Windows 10 Enterprise» в базу данных под столбцом Kernel_Version.

UPDATE :

После использования подсказок @zedfoxus я смог успешно получить данные, вот что у меня есть, теперь, как я могу сделать следующие строки более эффективными? Я использую elif, получаю ошибки,

def insert_data(psinfo):                                                                             
    with open(psinfo) as f:                                                                          
            file_data = f.readlines()                                                                
    for item in file_data:                                                                           
           if 'Kernel version' in item:                                                              
               info = item.strip().split(':')                                                        
               val = info[1].strip().split(',')                                                      

           elif 'Product type' in item:                                                              
             info = item.strip().split(':')                                                          
             val = info[1].strip().split(',')                                                        
             c.execute(                                                                              
                 'INSERT INTO system_information (Kernel_version,Product_type ) values(?,?)',        
                 (val[1].strip(),)                                                                   
             )                                                                                       
             conn.commit()         

1 Ответ

1 голос
/ 24 апреля 2019

Допустим, у вас есть файл с именем kernel.txt, который содержит

Kernel version:            Windows 10 Enterprise, Multiprocessor Free
Product type:              Professional
Product version:           6.3
Service pack:              0

Ваш код на Python должен будет просто прочитать этот текстовый файл и вставить данные в SQLite следующим образом:

import sqlite3
conn = sqlite3.connect('systeminfo.db')
c = conn.cursor()

def create_table():
    # same thing you had...just removing it for brevity

def insert_data(filename):

    # read all the lines of the file
    with open(filename) as f:
        file_data = f.readlines()

    # if Kernel version exists in the line, split the line by :
    # take the 2nd item from the split and split it again by ,
    # take the first item and pass it to the insert query
    # don't forget to commit changes
    for item in file_data:
        if 'Kernel version' in item:
            info = item.strip().split(':')
            val = info[1].strip().split(',')
            c.execute(
                'insert into system_information (Kernel_version) values(?)',
                (val[0].strip(),)
            )
            conn.commit()

create_table()
insert_data('kernel.txt')

Вам придется изменить этот код, если у вас есть несколько файлов, содержащих такую ​​информацию, или если у вас есть один файл, содержащий несколько блоков аналогичной информации. Этот код поможет вам начать работу.

Обновление

Я разделил анализ данных на его собственную функцию, которую я могу вызывать несколько раз. Обратите внимание, как я создал 3 переменные для хранения дополнительной информации, такой как тип продукта и версия. Выполнение insert происходит вне цикла. По сути, мы собираем всю необходимую нам информацию и затем вставляем ее в один кадр.

import sqlite3
conn = sqlite3.connect('systeminfo.db')
c = conn.cursor()

def create_table():
    # same thing you had...just removing it for brevity
    pass

def get_value(item):
    info = item.strip().split(':')
    val = info[1].strip().split(',')
    return val[0].strip()

def insert_data(filename):

    # read all the lines of the file
    with open(filename) as f:
        file_data = f.readlines()

    # if Kernel version exists in the line, split the line by :
    # take the 2nd item from the split and split it again by ,
    # take the first item and pass it to the insert query
    # don't forget to commit changes
    kernel_version = ''
    product_type = ''
    product_version = ''

    for item in file_data:
        if 'Kernel version' in item:
            kernel_version = get_value(item)
        elif 'Product type' in item:
            product_type = get_value(item)
        elif 'Product version' in item:
            product_version = get_value(item)

    c.execute(
        '''insert into system_information
        (Kernel_version, Product_type, Product_version)
        values(?, ?, ?)''',
        (kernel_version, product_type, product_version,)
    )
    conn.commit()

create_table()
insert_data('kernel.txt')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...