Чтение элементов из CSV и обновление тех же элементов в другом CSV - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю над методом чтения данных из input.csv и обновления столбца stock в output.csv на основе id

продукта. Это шаги, над которыми я работаюпрямо сейчас:

1. Считайте информацию о продукте из input.csv в input_data = [], что вернет список OrderedDict.

input_data в настоящее время выглядит следующим образом:

[OrderedDict([('id', '1'), ('name', 'a'), ('stock', '33')]), OrderedDict([('id', '2'), ('name', 'b'), ('stock', '66')]), OrderedDict([('id', '3'), ('name', 'c'), ('stock', '99')])]

2. Считать текущую информацию о продукте из output.csv в output_data = [], которая имеет ту же схему, что и input_data

3. Выполните итерацию по input_data и обновите столбец stock в output_data на основе информации о запасах в input_data. Какой лучший способ сделать это?

-> Важным упоминанием является то, что в input_data могут быть некоторые идентификаторы, которые существуют в input_data, но не существуют вoutput_data.Я бы хотел обновить акции для id s, общих для input_data и output_data, и "новые" id s, скорее всего, будут записаны в новый csv.

Я думал о чем-то вроде (это не настоящий код):

for p in input_data:
    # check if p['id'] exists in the list of output_data IDs (I might have to create a list of IDs in output_data for this as well, in order to check it against input_data IDs
    # if p['id'] exists in output_data, write the Stock to the corresponding product in output_data
    # else, append p to another_csv

Я знаю, это выглядит довольно грязно, я спрашиваю о том, чтобы найти логичный способ подойти к этой миссии, не тратя впустуюслишком много времени на вычисленияДлина файлов, о которых идет речь, будет, вероятно, 100 000 строк, поэтому производительность и скорость будут проблемой.

Если мои данные из input_data и output_data имеют значение list из OrderedDict,Каков наилучший способ проверить id в input_data и записать stock в продукт с точно таким же id в output_data?

1 Ответ

0 голосов
/ 14 февраля 2019

Хотя Python может быть не лучшим вариантом, я бы не использовал списки OrderDict для этой задачи.Это просто потому, что попытка изменить что-либо в пределах output_data потребует сложности O (n), которая просто преобразует ваш скрипт в O (n ** 2).Я бы сохранил два файла в формате dicts (или OrderedDicts, если вы заботитесь о порядке), вот так (и уменьшил бы сложность всего этого до O (n)):

input_data = {
    '1': ['a', '33'],
    '2': ['b', '66'],
    '3': ['c', '99']
}
output_data = {
    '1': ['a', '31'],
    '3': ['c', '95']
}

# iterate through all keys in input_data and update output_data
# if a key does not exist in output_data, create it in a different dict
new_data = {}
for key in input_data:
    if key not in output_data:
        new_data[key] = input_data[key]
        # for optimisation's sake you could append data into the new file here
        # and not save into a new dict
    else:
        output_data[key][1] = input_data[key][1]
        # for optimisation's sake you could append data into a new output file here
        # and rename/move the new output file into the old output file after the script finishes
...