Импорт файла CSV в MySQL загружает только 1 строку - PullRequest
1 голос
/ 18 апреля 2020

Цель: у меня есть папка с большим количеством CSV-файлов (через запятую). Я хочу провести l oop через каждый файл и загрузить его в одну таблицу MySQL и включить имя файла в виде столбца в таблице.

Я ожидаю, что код загрузит все содержимое каждого файла. Но он загружает только 1 строку данных для каждого файла. Код взят из книги, поэтому теоретически он должен работать. Я надеюсь, что есть небольшая настройка, необходимая для того, чтобы она работала против необходимости начинать с нуля. Я прочитал несколько других постов, но не нашел эту конкретную c проблему.

Я на Windows 10. 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 содержит элементы "первой части" кода и использует дату и тикер в качестве первичных ключей.

Я не получаю никаких сообщений об ошибках.

Есть идеи, почему он загружает только 1 строку?

Вывод запроса:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...