【问题标题】:Python Databases of Variable Length Inputs可变长度输入的 Python 数据库
【发布时间】:2023-03-21 00:45:02
【问题描述】:

古腾·摩根。

我目前正在尝试从 excel 文件编译 Python3.9 中的数据库。我的想法是,我将有一个我可以更轻松地修改的 excel 文件,然后有一个 python 脚本将其转换为 .db 文件以用于其他脚本。

现在我的第一个主要问题是输入数据类型具有不同数量的输入值。我拥有的最小输入长度是 3(伏特、V、mV)和约 50 的输入(我不会把它扔进去,相信我)。对于数据库的手动输入,我一直使用 '' 作为较短输入的占位符,但必须有更好的方法,对吧?如果有,请告诉我。底部附有基本手动代码,用于 14 长度输入数组,而不是完整的 50 原因,呃。无论如何,提前谢谢!

编辑:我遇到了两个主要问题。第一个(已解决)是转换我的 Excel 文件中长度不一致的输入。第二个是初始化一个可以接受任意长度数据输入的数据库。因此,如果我有 10 行的 excel 输入,每行包含 5 个数据点,或者 80 行的 excel 输入,每行包含 60 个数据点。我希望有一种方法可以初始化数据库,以便我可以轻松接受任何一种情况,而不必硬编码特定数量的输入。

con = sl.connect('793unitDB.db')

try:
    with con:
        con.execute("""
            CREATE TABLE USER (
                id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                unitName TEXT,
                unitType01 TEXT,
                unitType02 TEXT,
                unitType03 TEXT,
                unitType04 TEXT,
                unitType05 TEXT,
                unitType06 TEXT,
                unitType07 TEXT,
                unitType08 TEXT,
                unitType09 TEXT,
                unitType10 TEXT,
                unitType11 TEXT,
                unitType12 TEXT
            );
        """)
except:
    #print("Failed Initialisation")
    pass

sql = 'INSERT INTO USER (id, unitName, unitType01, unitType02, unitType03, unitType04, unitType05, unitType06, unitType07, unitType08, unitType09, unitType10, unitType11, unitType12) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
data = [
    (1, 'Length', 'cm', 'ft', 'in', 'km', 'm', 'micron', 'µm', 'mile', 'mm', 'nm', '', ''),
    (2, 'Force', 'DaM', 'dyn', 'gf', 'kgf', 'kip', 'nK', 'lbf', 'mN', 'MT', 'N', 'ozf', 'MN'),
    (3, 'Time', 'h', 'min', 'ms', 's', '', '', '', '', '', '', '', ''),
    (4, 'Volts', 'V', 'mV', '', '', '', '', '', '', '', '', '', '')
]
try: 
    with con:
        con.executemany(sql, data)
except: 
    pass

with con:
    data = con.execute("SELECT * FROM USER ")
    for row in data:
        print(row)

【问题讨论】:

    标签: python database sqlite openpyxl python-3.9


    【解决方案1】:

    如果您使用 Excel 文件作为中间格式,您将不会遇到长度不均匀的行的问题,因为 ws.iter_rows(min_col=1, max_col=50, values_only=True) 总是为您提供具有 50 个值的元组。

    您可以在直接工作时使用相同的方法:只需创建一个包含 50 个项目的列表并尽可能多地覆盖项目。

    data = [
        (1, 'Length', 'cm', 'ft', 'in', 'km', 'm', 'micron', 'µm', 'mile', 'mm', 'nm', '', ''),
        (2, 'Force', 'DaM', 'dyn', 'gf', 'kgf', 'kip', 'nK', 'lbf', 'mN', 'MT', 'N', 'ozf', 'MN'),
        (3, 'Time', 'h', 'min', 'ms', 's', ),
        (4, 'Volts', 'V', 'mV', )
    ]
    
    rows = []
    for item in data:
        row = [""]*50
        row[:len(item)] = item
        rows.append(row)
    
    con.executemany(sql, rows)
    

    您的另一个问题似乎是关于动态创建架构和插入语句。这很容易做到,但如果您的数据库支持,您最好使用Array 数据类型。动态创建 SQL 语句总是会带来 SQL 注入的风险,但如果您想这样做,请考虑使用 zfill

    【讨论】:

    • 工作就像一个魅力!我也可以使用这样的方法进行数据库初始化吗?到目前为止,我有一个 82 行的输入文件,最长的行有 60 个字符串,所以我的结果数据 [] 是 [82] [61]。或者,我是否需要用 61 个固定行初始化数据库并从那里开始?
    • 对不起,我不明白。请编辑您最初的问题以提供更多信息。
    • 对不起,我希望我澄清了我在这个脚本中遇到的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多