仅使用Python内置,是否可以只读入一组指定的列以添加到Python字典中?

2024-09-27 09:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列的标题名,来自一系列有50多个字段的大量csv文件。在这些文件中,我需要的列的索引并不总是相同的

我编写了代码,可以在每个文件中找到列的索引号。现在我只想添加这个列作为字典中的键,在字典中,这个值计算这个列中唯一字符串的数量

因为这些csv文件是海量的,而且我正在尝试使用最佳实践来实现高效的数据工程,所以我正在寻找一种使用最少内存的解决方案。我找到的每一个将csv写入字典的解决方案都涉及将csv中的所有数据写入字典,我认为这是没有必要的。最好的解决方案似乎只需要读入这一列的数据,然后将这一列添加到dictionary键中

所以,让我们把这个作为样本数据:

FOODS;CALS
"PIZZA";600
"PIZZA";600
"BURGERS";500
"PIZZA";600
"PASTA";400
"PIZZA";600
"SALAD";100
"CHICKEN WINGS";300
"PIZZA";600
"PIZZA";600

我想要的结果是:

food_dict = {'PIZZA': 6, 'PASTA': 1, 'BURGERS': 1, 'SALAD': 1, 'CHICKEN WINGS': 1}

现在假设我只需要FOODS列的数据,在本例中,我将索引值设置为变量food\u index

以下是我尝试过的方法,问题是不同文件中的列并不总是位于同一索引位置,因此此解决方案不起作用:

from itertools import islice


with open(input_data_txt, "r") as file:
    # This enables skipping the header line.
    skipped = islice(file, 1, None)
    for i, line in enumerate(skipped, 2):

        try:
            food, cals = line.split(";")

        except ValueError:
            pass

food_dict = {}

if food not in food_dict:
    food_dict[food] = 1

else:
    food_dict[food] += 1

此解决方案仅适用于此示例—但前提是我提前知道了列的位置—并且再次提醒我,我有50多列,而且我需要的列的索引位置在不同的文件中是不同的

有可能这样做吗?再说一次,只有内置的——没有熊猫、小熊猫或其他类似的软件包


Tags: 文件csv数据字典foodline解决方案dict
2条回答

使用^{}^{}

from collections import Counter
import csv

with open(filename) as f:
    reader = csv.reader(f)
    next(reader, None)  # skips header
    histogram = Counter(line[0] for line in reader)

这里最重要的一点是不要跳过标题行!您需要split那一行并找到所需列的索引!由于您知道所需信息的列标题,请将其放入参考列表中:

wanted_headers = ["FOODS", "RECYCLING"]

with open(input_data_txt, "r") as infile:
    header = infile.read().split(';')
    wanted_cols = [header.index(label) for label in wanted_headers if label in header]
    # wanted_cols is now a list of column numbers you want

    for line in infile.readlines():    # Iterate through remaining file
        fields = line.split(';')
        data = [fields[col] for col in wanted_cols]

现在,数据的顺序与现有标题相同;您可以根据需要进行匹配或重新排列

这能解决你的障碍点吗?我给你留下了很多实施方案

相关问题 更多 >

    热门问题