Python 将CSV文件导入MySQL仅加载1行
目标:我有一个包含大量CSV文件(逗号分隔)的文件夹。我想循环遍历每个文件并将其加载到一个MySQL表中,并将文件名作为列包含在表中 我希望代码能够加载每个文件的全部内容。但它只为每个文件加载一行数据。代码来自一本书,因此理论上它应该是有效的。我的希望是有一个小的调整需要使其工作,而不是必须从头开始。我读过其他几篇文章,但没有发现这个具体问题 我在Windows10上。下面是Python代码。我不是程序员,也没有python方面的经验,但我正在学习Python 将CSV文件导入MySQL仅加载1行,python,mysql,csv,Python,Mysql,Csv,目标:我有一个包含大量CSV文件(逗号分隔)的文件夹。我想循环遍历每个文件并将其加载到一个MySQL表中,并将文件名作为列包含在表中 我希望代码能够加载每个文件的全部内容。但它只为每个文件加载一行数据。代码来自一本书,因此理论上它应该是有效的。我的希望是有一个小的调整需要使其工作,而不是必须从头开始。我读过其他几篇文章,但没有发现这个具体问题 我在Windows10上。下面是Python代码。我不是程序员,也没有python方面的经验,但我正在学习 import os import panda
import os
import pandas as pd
from sqlalchemy import create_engine
from tqdm import tqdm_notebook
engine = create_engine('mysql+mysqlconnector://root:root@localhost/myDB')
data_location = 'C://folder//'
def import_file(symbol):
path = data_location + '{}.csv'.format(symbol)
df = pd.read_csv(path, index_col=[0], parse_dates=[0])
# part one
insert_init = """insert into table
(date, ticker, open, high, low, close, volume, dividend)
values
"""
# part two - add values
vals = ",".join(["""('{}', '{}', {}, {}, {}, {}, {}, {}, {})""".format(
str(day),
symbol,
row.open,
row.high,
row.low,
row.close,
row.volume,
row.dividend
) for day, row in df.iterrows()])
# part three - Handle dups
insert_end = """ on duplicate key update
open=values(open),
high=values(high),
low=values(low),
close=values(close),
volume=values(volume),
dividend=values(dividend),"""
# Put the parts together
query = insert_init + vals + insert_end
engine.execute(query)
def process_symbols():
symbols = [s[:-4] for s in os.listdir(data_location)]
for symbol in tqdm_notebook(symbols, desc='Importing...'):
import_file(symbol)
process_symbols()
MySQL表包含代码“第一部分”中的元素,并使用date和ticker作为主键
我没有收到任何错误消息
知道为什么它只加载一行吗
查询输出:
insert into table
(date, ticker, open, high, low, close, volume, dividend)
values
('1999-11-18 00:00:00', 'A', 50.24309847871317, 50.24309847871317, 50.24309847871317, 50.24309847871317, 58425783.68, 0.0)
,('1999-11-19 00:00:00', 'A', 51.092206843003424, 51.092206843003424, 51.092206843003424, 51.092206843003424, 19084157.7, 0.0)
,('1999-11-22 00:00:00', 'A', 50.39224360925426, 50.39224360925426, 50.39224360925426, 50.39224360925426, 8310053.22, 0.0)
,('1999-11-23 00:00:00', 'A', 49.44990865376121, 49.44990865376121, 49.44990865376121, 49.44990865376121, 5328834.84, 0.0)
,('1999-11-24 00:00:00', 'A', 48.609260206647264, 48.609260206647264, 48.609260206647264, 48.609260206647264, 5861663.3999999985, 0.0)
on duplicate key update
open=values(open),
high=values(high),
low=values(low),
close=values(close),
volume=values(volume),
dividend=values(dividend);
如果查看
查询
变量,您会看到什么?这是一个开始解决此问题的好地方。从一个小的CSV文件开始,然后转到更大的文件。所以你加载一个文件,在哪里循环每一行来插入它?此外,它还存在带有参数的准备好的语句,这似乎是理想的。您也可以使用mysql来完成这项工作,但是需要使用带有插入的循环ok@O.Jones:我将文件减少到5行,但它仍然只加载第一行。查询输出确实显示了所有5行。我注意到在每一行的周围都添加了括号。mySQL可能会将此视为行终止?我试图编辑代码,使其不包含括号,但出现了语法错误(不知道该怎么做)。我不知道这是否是问题所在。我在上面添加了查询输出。@nbk:我确实找到了一些其他函数来循环文件并加载它们。但是,将文件名添加到列似乎不是一个带有参数的预先准备好的语句。是的,这就是我提到它的原因。它非常适合您的目的,但是您的代码仍然可以接受sql注入,因此我仍然认为您应该尝试一下,特别是如果您不知道csv来自何处,那么查看查询
变量会看到什么?这是一个开始解决此问题的好地方。从一个小的CSV文件开始,然后转到更大的文件。所以你加载一个文件,在哪里循环每一行来插入它?此外,它还存在带有参数的准备好的语句,这似乎是理想的。您也可以使用mysql来完成这项工作,但是需要使用带有插入的循环ok@O.Jones:我将文件减少到5行,但它仍然只加载第一行。查询输出确实显示了所有5行。我注意到在每一行的周围都添加了括号。mySQL可能会将此视为行终止?我试图编辑代码,使其不包含括号,但出现了语法错误(不知道该怎么做)。我不知道这是否是问题所在。我在上面添加了查询输出。@nbk:我确实找到了一些其他函数来循环文件并加载它们。但是,将文件名添加到列似乎不是一个带有参数的预先准备好的语句。是的,这就是我提到它的原因。这对于您的目的来说是完美的,但是您的代码仍然可以接受sql注入,所以我仍然认为您应该尝试一下,特别是如果您不知道csv来自何处的话