从一个 csv 中读取项目并更新另一个 csv 中的相同项目
Reading items from a csv and updating the same items in another csv
我正在研究一种从 input.csv
读取数据的方法,并根据产品的 id
更新 output.csv
中的 stock
列
这些是我现在正在处理的步骤:
1. 将产品信息从 input.csv
读取到 input_data = []
,这将 return 一个 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
并根据 input_data
中的股票信息更新 output_data
中的 stock
列。 最好的方法是什么?
-> 一个重要的提及是在 input_data
中可能有一些 ID 在 input_data
中存在但在 output_data
[=70= 中不存在].我想 更新 input_data
和 output_data
共有 id
的股票 ,以及 "new" 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
中的 id
的最佳方法是什么17=] 并将 stock
写入 output_data
?
中具有完全相同 id
的乘积
虽然 Python 可能不是您的最佳选择,但我不会为此任务使用 OrderDict 列表。这仅仅是因为尝试在 output_data
内更改某些内容需要 O(n) 的复杂性,这只会在 O(n**2) 中转换您的脚本。
我会将这两个文件保存在字典中(如果你关心顺序,则保存在 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
我正在研究一种从 input.csv
读取数据的方法,并根据产品的 id
output.csv
中的 stock
列
这些是我现在正在处理的步骤:
1. 将产品信息从 input.csv
读取到 input_data = []
,这将 return 一个 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
并根据 input_data
中的股票信息更新 output_data
中的 stock
列。 最好的方法是什么?
-> 一个重要的提及是在 input_data
中可能有一些 ID 在 input_data
中存在但在 output_data
[=70= 中不存在].我想 更新 input_data
和 output_data
共有 id
的股票 ,以及 "new" 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
中的 id
的最佳方法是什么17=] 并将 stock
写入 output_data
?
id
的乘积
虽然 Python 可能不是您的最佳选择,但我不会为此任务使用 OrderDict 列表。这仅仅是因为尝试在 output_data
内更改某些内容需要 O(n) 的复杂性,这只会在 O(n**2) 中转换您的脚本。
我会将这两个文件保存在字典中(如果你关心顺序,则保存在 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