使用 Python 从 CSV 创建表

使用 Python 从 CSV 创建表

不久前,我意识到我在数据仓库中为我的工作制作了很多表,而我是手动完成的。我将使用 create table 语句,然后我必须查看我正在加载的 CSV 并弄清楚我需要哪些列,以及这些列需要什么类型的数据。

最疯狂的是,然后我将有一个 python 脚本获取我正在使用的 CSV 并将数据发送到我刚刚创建的表中。

现在这并没有花费很长时间,除非它是一个非常宽的 CSV 列。有一天,我决定不只是使用 python 将数据发送到表中,而是使用它来创建表。

关于我是如何做到这一点的,你会想知道几件事。我使用的数据仓库是 MSSQL,尽管我认为您应该能够对任何其他数据库执行此操作,只需弄清楚它附带的细微差别。我还具有对数据库或数据仓库中的模式的读写访问权限。

这实际上仅适用于 BI 的东西,我们使用许多其他流程从其他地方获取数据。

我目前也有这个设置,只是为了构建一个表,然后从 CSV 将数据添加到表中的特定任务。下一步是设置一个脚本,以便您可以从 CSV 插入新数据。

好吧,没有进一步的告别,我将在这里发布代码,希望能够以一种可以理解的方式解释它。

我会在信用到期的地方给予信用。我从这篇文章中得到了这段代码的一部分。

[

如何在 Pandas 中读取 CSV 文件时自动检测日期/日期时间列并设置其数据类型

当 read_csv() 将“2021-03-04”和“2021-03-04 21:37:01.123”读取为仅仅是“对象”类型时,您通常可以自动转换......

向datascience.com

](https://towardsdatascience.com/auto-detect-and-set-the-date-datetime-datatypes-when-reading-csv-into-pandas-261746095361)

我遇到了在数据集中看到日期的问题,这篇文章让我能够获取代码,以便能够将它们视为日期而不仅仅是对象。

 将熊猫导入为 pd  
 def dt_inplace(df):  
 """自动检测和转换(就地!)每个  
 数据类型“对象”的数据框列到日期时间只是  
 当可以成功解析其所有非 NaN 值时  
 通过 pd.to_datetime()。还返回一个参考。为 df  
 在表达式中方便使用。  
 """  
 从 pandas.errors 导入 ParserError  
 对于 df.columns [df.dtypes=='object'] 中的 c:  
 尝试:  
 df[c]=pd.to_datetime(df[c])  
 除了(ParserError,ValueError):  
 经过 #  
 返回df  
 def read_csv(*args, **kwargs):  
 """Pandas pd.read_csv 的插入式替换。它调用  
 pd.read_csv() (传递它的参数),然后自动  
 自动检测并转换其数据类型的每一列  
 只是当所有列的  
 非 NaN 值可以被成功解析  
 pd.to_datetime(),并返回结果数据帧。  
 """  
 return dt_inplace(pd.read_csv(*args, **kwargs)) ## 这是我在另一篇文章中使用的部分。他们俩  
 上面的## 函数用于使日期实际显示为日期。  
 def 创建动态表(csv_name):  
 table_name = csv_name ##这是csv名称  
 df = read_csv(f'{table_name}.csv') ## 将 csv 名称附加到 .csv 并读入  
 df2 = df.astype(object).where(pd.notnull(df), None)  
 result = df.dtypes ##获取列的类型  
 结果 = pd.DataFrame(result).reset_index()  
 结果 = result.rename(columns={0: "type"})  
 for i in range(0,len(result)): ## 确定每个对象应该是什么  
 如果结果.iloc[i,1] == 'int64':  
 结果.iloc[i,1] = 'int'  
 如果结果.iloc[i,1] == 'object':  
 result.iloc[i,1] = 'varchar(255)' ## 我使用了 255,因为这是最大的。如果您对太空尽责,可能不是最好的。  
 如果结果.iloc[i,1] == 'float64':  
 result.iloc[i,1] = '十进制'  
 如果结果.iloc[i,1] == 'bool':  
 结果.iloc[i,1] = 'int'  
 如果结果.iloc[i,1] == 'datetime64[ns]':  
 结果.iloc[i,1] = 'datetime2'  
 结果['test'] = 结果['index']+' '+result['type']  
 columns_statement = 结果['test'].str.cat(sep=', ')  
 导入 pymssql  
 导入pyodbc  
 从日期时间导入日期时间 服务器 = '服务器'  
 数据库 = '数据库'  
 用户名 = '用户名'  
 密码='密码'  
 driver='{ODBC Driver 17 for SQL Server}'  
 connect = pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+server+';PORT=1234;DATABASE='+database+';UID='+username+';PWD='+密码)  
 游标 = connect.cursor() create_table_exp = f'''创建表 {table_name} (  
 {columns_statement}  
 )'''  
 ## create table 表达式是通过上面的语句创建的 cursor.execute(create_table_exp) ## 语句被读入数据库。  
 连接.commit()  
 光标.close() connect = pyodbc.connect('DRIVER='+driver+';SERVER=tcp:'+server+';PORT=1234;DATABASE='+database+';UID='+username+';PWD='+密码)  
 游标 = connect.cursor()  
 cursor.fast_executemany = True  
 number_of_columns = '?,'*(len(df.columns)-1)+ '?'  
 insert_exp = f“插入 {table_name} 值({number_of_columns})”  
 ## 插入是通过上面的语句处理的。  
 cursor.executemany(f"{insert_exp}",df2.values.tolist()) ##快速插入数据库  
 连接.commit()  
 光标.close()  
 print(f'{table_name} has been created') ##让你知道代码何时完成

有代码。我在其中留下了评论以对每个部分进行解释,但我可以在这里大致介绍一下。

  • 前 2 个函数是我在另一篇文章中使用的,它们有助于标注日期,因此这些日期将在脚本后面显示为日期而不是对象。
  • 唯一的参数是 CSV 的名称。我进行了此设置,因此 CSV 必须与 python 脚本位于同一文件夹中。我相信您可以通过多种方式定义 CSV 的位置,但我保持简单。
  • 该脚本查找每个列的类型。
  • 该脚本将这些列中的每一个映射到 MSSQL 可以理解的内容。
  • 然后必须建立与数据仓库的连接。
  • 一旦设置好,我们需要做的就是将映射中的所有信息与创建表所需的语句结合起来。
  • 然后使用类似的思路将 CSV 中的数据插入到创建的表中。

我希望这可以帮助像我这样希望减少创建表格的人。我知道可能有更好的方法可以做到这一点,但我发现这种方法非常干净和直接。

享受!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/24698/00521010

posted @ 2022-09-10 10:01  哈哈哈来了啊啊啊  阅读(454)  评论(0编辑  收藏  举报