【问题标题】:mapping excel columns to table column in database with python使用python将excel列映射到数据库中的表列
【发布时间】:2022-07-22 12:15:04
【问题描述】:

json 文件

"mappingdef": [
                {
                    "src": "A",
                    "dest": "id"
                },
                {
                    "src": "B",
                    "dest": "expense_type"
                },
                {
                    "src": "C",
                    "dest": "balance"
                },
                {
                    "src": "D",
                    "dest": "debit"
                },
                {
                    "src": "E",
                    "dest": "credit"
                },
                {
                    "src": "F",
                    "dest": "total_balance"
                }
            ]

我的 python 脚本:

#更改excel列名

df.columns = ["A", "B", "C", "D", "E", "F"]

#从数据帧中获取数据

for row in range(df.shape[0]):
    col_A = str(df.at[row, "A"]),
    col_B = str(df.at[row, "B"]),
    col_C = float(df.at[row, "C"]),
    col_D = float(df.at[row, "D"]),
    col_E = float(df.at[row, "E"]),
    col_F = float(df.at[row, "F"])

#查询在数据库中插入数据

query2 = """
    INSERT INTO ocean_street_apartments(
    id,
    expense_type,
    balance,
    debit,
    credit,
    total_balance)
    values (%s, %s, %s, %s, %s, %s)
    """

我在 json 中有这个表定义信息,它告诉 src 作为 excel 列,而 dest 作为数据库表列名。我想通过 pandas 读取一个 excel 文件,并想将 excel 列(src)映射到数据库表列(dest)。我在 python 中工作

【问题讨论】:

  • 你尝试了什么?
  • 我正在明智地从 pandas 列中获取 excel 数据并将它们存储在一些变量中,但不知道如何将它们映射到表列,以便自动获取数据将保存到我们想要的表列中我希望将 A 列和 B 列数据存储在表的一列中...
  • 我的意思是:你能给我们提供一个可重现的例子吗?给我们几行代码,带有示例数据(您的 excel 文件的一两条记录,它可能是虚拟数据),所需的输出和您当前拥有的输出;这样我们就可以更好地了解您是否已经设法提取数据,它具有什么格式等等......然后我们可以从那里找到解决方案。
  • 现在,如果您的数据位于 pandas 数据框中,我建议您只需使用 Dataframe.rename 将 excel 命名方案中的列重命名为您的新命名方案,然后使用 Dataframe.to_sql() 即可将其导出为 sql 表。
  • 我有一个 excel 文件,我正在读取 pandas 我只想在 python 中使用自动化代码将 excel 的 A 列保存到数据库表的第一列 B 列到表的第二列,我有只有一个 json 文件,它告诉我在上面写的数据库表 json 文件的这一列中将保存哪个 excel 列......我希望你能理解我的感受......

标签: python excel postgresql


【解决方案1】:

假设它的 JSON 文件所以它的 API 得到响应。

我假设您知道该怎么做: 1)获取获取响应,返回的是每个文件的对象描述数组。 2)创建脚本以下载它并将其移动到 DF。

现在您有一个指向我们 csv 文件的直接链接列表!我们可以使用 pandas.read_csv(url) 直接读取这些 url。

如果数据有问题转换他们。

是时候使用 pandas.DataFrame.to_sql 将 DF 直接加载到 SQL DB 中了

下面的代码描述了如何连接到 SQLite 数据库。

def upload_to_sql(filenames, db_name, debug=False):
    """ Given a list of paths, upload to a database
    """
    conn = sqlite3.connect(f"{db_name}.db")
    
    if debug:
        print("Uploading into database")
    for i, file_path in tqdm(list(enumerate(filenames))):
        
        dat = pd.read_csv(file_path)

        # rename labels
        filename = os.path.basename(file_path).split('.')[0]
        dat = factor_dataframe(dat, filename)

        # write records to sql database
        if i == 0: # if first entry, and table name already exist, replace
            dat.to_sql(db_name, con=conn, index = False, if_exists='replace')
        else: # otherwise append to current table given db_name
            dat.to_sql(db_name, con=conn, index = False, if_exists='append')


# upload into sql database
upload_to_sql(download_urls, 'example', debug=True)

【讨论】:

  • 我不想用 .tosql 方法保存数据,我想将数据保存在块列中
【解决方案2】:
import psycopg2
import ijson

conn = psycopg2.connect(
    host="localhost",
    database="sea",
    user="postgres",
    password="hemant888")

cursor = conn.cursor()
chunk_size = 10
skiprows = 5
file_name = "Ocean Street Apartments Trial Balance 03-22.xlsx"

cursor.execute("""
        SELECT COUNT(*)
        FROM information_schema.tables
        WHERE table_name = 'ocean_street_apartments'
        """)

if cursor.fetchone()[0] != 1:
    columns = list()
    datatype = list()
    row = list()
    with open("tabledef.json", "r") as f:
        for record in ijson.items(f, "item"):
            for i in record["def"]["tabledef"]["columns"]:
                col = i["name"]
                columns.append(col)

                dt = i["datatype"]
                datatype.append(dt)

    for i in range(len(columns)):
        row.append("{col} {dt}".format(col=columns[i], dt=datatype[i]))

    query1 = "create table ocean_street_apartments(" + \
        ",".join(map(str, row)) + ")"

    cursor.execute(query1)
    conn.commit()

while True:
    df_chunk = pd.read_excel(file_name, skiprows=skiprows,
                             nrows=chunk_size)
    skiprows += chunk_size

# When there is no data, we know we can break out of the loop.
    if not df_chunk.shape[0]:
        break

    else:
        columns = list()
        columns_table = list()
        with open("tabledef.json", "r") as f:
            for record in ijson.items(f, "item"):
                for i in record["def"]["tabledef"]["mappingdef"]:
                    col = i["src"]
                    columns.append(col)

                    col_table = i["dest"]
                    columns_table.append(col_table)

        query2 = "INSERT INTO ocean_street_apartments(" + ",".join(
            map(str, columns_table)) + ")values (%s, %s, %s, %s, %s, %s)"

        df_chunk.columns = columns
        values_list = list()
        for row in range(df_chunk.shape[0]):
            for col in df_chunk.columns:
                val = str(df_chunk.at[row, col])
                values_list.append(val)
            values = tuple(values_list)
            cursor.execute(query2, values)
            values_list = list(values)
            values_list.clear()
            values = tuple(values_list)
conn.commit()
conn.close()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多