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

时间:2018-10-31 17:47:42

标签: python dictionary built-in

我有一系列包含50多个字段的大型csv文件的列标题名称。在文件中,我需要的列索引并不总是相同。

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

由于这些csv文件很大,并且我正在尝试使用最佳实践进行有效的数据工程,因此我正在寻找一种使用最少内存的解决方案。我找到的将csv写入字典的所有解决方案都涉及将csv中的所有数据写入字典,我认为这不是必需的。最好的解决方案似乎只涉及从这一列中读取数据,并将此列添加到字典键中。

因此,我们将其作为示例数据:

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_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列以上的列,而我需要的列的索引位置有所不同跨文件。

是否可以这样做?同样,仅内置-没有Pandas或Numpy或其他类似程序包。

2 个答案:

答案 0 :(得分:0)

使用Countercsv

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)

答案 1 :(得分:0)

这里重要的部分是您不要跳过标题行!您需要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]

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

能解决您的障碍吗?我为您留出了很多实施方案...