Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将CSV文件导入MySQL仅加载1行_Python_Mysql_Csv - Fatal编程技术网

Python 将CSV文件导入MySQL仅加载1行

Python 将CSV文件导入MySQL仅加载1行,python,mysql,csv,Python,Mysql,Csv,目标:我有一个包含大量CSV文件(逗号分隔)的文件夹。我想循环遍历每个文件并将其加载到一个MySQL表中,并将文件名作为列包含在表中 我希望代码能够加载每个文件的全部内容。但它只为每个文件加载一行数据。代码来自一本书,因此理论上它应该是有效的。我的希望是有一个小的调整需要使其工作,而不是必须从头开始。我读过其他几篇文章,但没有发现这个具体问题 我在Windows10上。下面是Python代码。我不是程序员,也没有python方面的经验,但我正在学习 import os import panda

目标:我有一个包含大量CSV文件(逗号分隔)的文件夹。我想循环遍历每个文件并将其加载到一个MySQL表中,并将文件名作为列包含在表中

我希望代码能够加载每个文件的全部内容。但它只为每个文件加载一行数据。代码来自一本书,因此理论上它应该是有效的。我的希望是有一个小的调整需要使其工作,而不是必须从头开始。我读过其他几篇文章,但没有发现这个具体问题

我在Windows10上。下面是Python代码。我不是程序员,也没有python方面的经验,但我正在学习

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来自何处的话