gpt4 book ai didi

python - Django 、Python : Best way to parse a CSV and convert to Django model instances

转载 作者:行者123 更新时间:2023-12-01 01:49:46 25 4
gpt4 key购买 nike

我有一个用户上传 CSV 文件的页面。这一点有效。

我可以读取 CSV 并将其转换为列表。我认为应该更快的东西需要相当多的时间(对于 17mb 的 CSV 文件,解析并将其转换为列表大约需要 7 秒)。

我现在想知道,执行此操作的最佳方法是什么?到目前为止,我的代码非常复杂(很久以前由一位计算机科学毕业生同事写的,现已离开),我想我想重写它,因为它太慢了。

我以前没有使用过 CSV。现在这就是我所拥有的:

import codecs
import csv
import sys

def read_csv_file(self, file_path):
is_file = False
while not is_file:
if os.path.exists(file_path):
is_file = True
result_data = []

csv.field_size_limit(sys.maxsize)

csv_reader = csv.reader(codecs.open(file_path, 'rU', 'utf-8'), delimiter=',')

for row in csv_reader:
result_data.append(row)

return result_data

将 CSV 转换为列表(然后我可以压缩?)是最好的方法吗?

最终,目标是创建数据库对象(也许是在循环中?),这就像循环遍历每个列表,使用索引创建对象,将这些对象附加到对象列表,然后执行批量创建:

object_instance_list.append(My_Object.objects.get_or_create(property=csv_property[some_index], etc etc)[0])
My_Object.bulk_create(object_instance_list)

这样会有效率吗?

我应该使用听写吗?

是否有一个内置方法可以支持 Python 的 CSV 或已经实现的一些 Django 功能?

基本上,由于我没有那样的经验,而且这是我第一次使用 CSV,所以我希望从一开始就做好它。

我将不胜感激在这方面的任何帮助,这样我就可以学习处理这个问题的正确方法。谢谢!

最佳答案

所以,这还没有经过测试,但从概念上讲你应该能够理解这个想法。诀窍是利用 **kwargs

import csv

def read_csv():
"""Read the csv into dictionaries, transform the keys necessary
and return a list of cleaned-up dictionaries.
"""
with open('data.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
return [map_rows_to_fields(row) for row in reader]

def map_rows_to_fields(row):
"""Here for each dictionary you want to transform the dictionary
in order to map the keys of the dict to match the names of the
fields on the model you want to create so we can pass it in as
`**kwargs`. This would be an opportunity to use a nice dictionary
comprehension.
"""
csv_fields_to_model_fields = {
'csv_field_1': 'model_field_1',
'csv_field_2': 'model_field_2',
'csv_field_n': 'model_field_n',
}
return {
csv_fields_to_model_fields[key]: value
for key, value in row.items()
}

def instantiate_models():
"""Finally, we have our data from the csv in dictionaries
that map values to expected fields on our model constructor,
then we can just instantiate each of those models from the
dictionary data using a list comprehension, the result of which
we pass as the argument to `bulk_create` saving the rows to
the database.
"""
model_data = read_csv()
MyModel.objects.bulk_create([
MyModel(**data) for data in model_data
])

方法 bulk_create 确实有一些注意事项,因此请确保在您的情况下可以使用它。

https://docs.djangoproject.com/en/2.0/ref/models/querysets/#bulk-create

如果您无法使用bulk_create,那么只需将模型置于循环中即可。

for data in model_data:
MyModel.objects.create(**data)

关于python - Django 、Python : Best way to parse a CSV and convert to Django model instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50854622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com