自动将 csv 文件插入 mysql 表

Posted

技术标签:

【中文标题】自动将 csv 文件插入 mysql 表【英文标题】:Automated insertion of csv files into mysql table 【发布时间】:2018-11-27 23:21:05 【问题描述】:

我正在尝试将大约 2000 个 csv 文件中的每一行插入到一个 mysql 表中。使用以下代码,我仅从一个文件中插入了一行。如何自动化代码以便为每个文件插入所有行?插入只需执行一次。

import pymysql.cursors
connection = pymysql.connect(host='localhost',
                         user='s',
                         password='n9',
                         db='si',
                         charset='utf8mb4',
                         cursorclass=pymysql.cursors.DictCursor)

try:
with connection.cursor() as cursor:
    sql = "INSERT INTO `TrainsS` (`No.`, `Name`,`Zone`,`From`,`Delay`,`ETA`,`Location`,`To`) VALUES (%s,%s,%s,%s,%s,%s,%s, %s)"
    cursor.execute(sql, ('03', 'P Exp','SF','HWH', 'none','no arr today','n/a','ND'))


connection.commit()
finally:
connection.close()

【问题讨论】:

如果是一次性活动,为什么不尝试使用 load in file 选项进行批量插入。 我试过BULK INSERT TrainsS FROM '\home\www\T\ins\train2018.csv' WITH (FIELDTERMINATOR = '","');,但它给出了一个错误 所以是一次性活动吗?如果是这样,您可能希望使用其他信息和错误来修改您的问题,应该有人可以帮助您。 【参考方案1】:

检查一下这段代码怎么样?

要运行它,您可以将所有 .csv 文件放在一个文件夹中,然后 os.walk(folder_location) 该文件夹以获取所有 .csv 文件的位置,然后我将它们一一打开并插入所需数据库(MySQL)在这里。

import pandas as pd
import os
import subprocess
import warnings
warnings.simplefilter("ignore")

cwd = os.getcwd()

connection = pymysql.connect(host='localhost',
                     user='s',
                     password='n9',
                     db='si',
                     charset='utf8mb4',
                     cursorclass=pymysql.cursors.DictCursor)
files_csv = []
for subdir, dir, file in os.walk(cwd):
    files_csv += [ fi for fi in file if fi.endswith(".csv") ]

print(files_csv)

for i in range(len(files_csv)):
    with open(os.path.join(cwd, files_csv[i])) as f:
        lis=[line.split() for line in f]
        for i,x in enumerate(lis):
            #print("line0 = 1".format(i,x))
            #HERE x contains the row data and you can access it individualy using x[0], x[1], etc
            #USE YOUR MySQL INSERTION commands here and insert the x row here.
            with connection.cursor() as cursor:
                sql = "INSERT INTO `TrainsS` (`No.`, `Name`,`Zone`,`From`,`Delay`,`ETA`,`Location`,`To`) VALUES (%s,%s,%s,%s,%s,%s,%s, %s)"
                cursor.execute(sql, (#CONVERTED VALUES FROM x))


connection.commit()

更新 - 获取 (#CONVERTED VALUES FROM X) 的值

values = ""
for i in range(len(columns)):
    values = values + x[i] + "," # Here x[i] gives a record data in ith row. Here i'm just appending the all values to be inserted in the sql table.
values = values[:-1] # Removing the last extra comma.
command = "INSERT INTO `TrainsS` (`No.`, `Name`,`Zone`,`From`,`Delay`,`ETA`,`Location`,`To`) VALUES (" + str(values) + ")"
cursor.execute(command)
#Then commit using connection.commit()

【讨论】:

我收到TypeError: not all arguments converted during string formatting 错误 哪一行? @python08 File "/usr/lib/python2.7/dist-packages/pymysql/cursors.py", line 156, in execute query = self.mogrify(query, args) File "/usr/lib/python2.7/dist-packages/pymysql/cursors.py", line 135, in mogrify query = query % self._escape_args(args, conn) 你把我的代码改成py2.7了吗?因为我发布了一个py3代码。而且我发布的代码中没有第 156 行或第 135 行。 我应该输入什么来代替'#converted values from x'?【参考方案2】:
     import psycopg2
     import time
     import csv
     conn = psycopg2.connect(
             host = "localhost",
              database = "postgres",
              user = "postgres",
              password = "postgres"
             )
     cur = conn.cursor()
     start = time.time()
     with open('combined_category_data_100 copy.csv', 'r') as file:
          reader=csv.reader(file)
          ncol = len(next(reader))
          next(reader)
          for row in reader:
                  cur.execute(" insert into data values (%s = (no. of columns 
                   ))", row)

          conn.commit()
          print("data entered successfully")
          end = time.time()
          print(f" time taken is end - start")
          cur.close()

【讨论】:

编号。你有没有的列。您必须在插入行中使用 %s 的次数 这将读取并插入一个文件。 OP 的问题是查找和处理 2000 个文件。

以上是关于自动将 csv 文件插入 mysql 表的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中有效地将数据插入 MySQL 中的多个表中

使用 python 库 mysql.connector 将 csv 插入 MySQL 数据库

将 CSV 中的中文字符插入 MySQL 时遇到问题

从 sql 文件或使用 csv 文件将数据插入 mysql

使用 vba 将 xls/csv 文件插入到 access 2007 表中

Codeigniter 将部分 CSV 数据插入到 MYSQL 中,只有 id 和 date