我有一个看起来或多或少的CSV文件:
STUDENT_SUBJECT_AREA_VALUE | STUDENT_LEVEL | HOST_INSTITUTION
222 1 UK
58 1 PT
222 1 FR
223 1 UK
222 1 PT
我需要做的是从' HOST_INSTITUTION'中获取值。列并计算该值出现的次数。输出应该是这样的字典:
{UK: 2, PT: 2, FR: 1}
我尝试将CSV文件转换为字典,但文件非常大,我只需要该特定列。有没有办法通过CSV并只读取我需要的列? 我将CSV文件转换为这样的字典:
def csv_to_dict(file_name):
with open(file_name, 'rU') as file:
reader = csv.DictReader(file, delimiter=',')
return [line for line in reader]
但是这样我就不必要地浏览所有列。如果我不是很清楚,请随时提出任何问题。
答案 0 :(得分:1)
shell方式:awk '{print $3}' csv_file_path | sort | uniq -c
您的csv文件使用多个空格分隔。
如果你不想使用Counter:
def csv_to_dict(file_name):
result = {}
with open(file_name, 'r') as file:
reader = csv.reader(file, delimiter=' ', skipinitialspace=True)
for row in reader:
key = row[2]
value = result.get(key, 0) + 1
result[key] = value
return result
dict.get(key, default_value)
,如果密钥不存在,则返回default_value
In [25]: csv_to_dict(your_file_path)
Out[25]: {'FR': 1, 'PT': 2, 'UK': 2}
我的csv文件内容:
STUDENT_SUBJECT_AREA_VALUE | STUDENT_LEVEL | HOST_INSTITUTION
222 1 UK
58 1 PT
222 1 FR
223 1 UK
222 1 PT
答案 1 :(得分:0)
除非它确实是一个性能瓶颈,否则你可能想要逐行读取所有列到内存。与您的解决方案不同,这并不是将整个CSV保留在内存中,而只是计数。
def csv_to_dict(file_name):
cnt = Counter()
with open(file_name, 'rU') as file:
reader = csv.reader(f, delimiter=',')
for row in reader:
host_inst = row[2]
cnt[host_inst] +=1
return cnt
>>> csv_to_dict("my_file.txt")
Counter({'UK':2,"PT":2,"FR":1})
答案 2 :(得分:0)
为了提高性能,您可能想尝试一下pandas。 例如:
import pandas as pd
d = pd.read_csv("bla.txt")
d.groupby("HOST_INSTITUTION").count(["STUDENT_SUBJECT_AREA_VALUE"].to_dict()
将产生所需的结果:)
{'UK': 2, 'FR': 1, 'PT': 2}
答案 3 :(得分:0)
以data.csv
作为输入文件
STUDENT_SUBJECT_AREA_VALUE | STUDENT_LEVEL | HOST_INSTITUTION
222 1 UK
58 1 PT
222 1 FR
223 1 UK
222 1 PT
您可以使用csv.DictReader()
来读取您的csv到dict
有了这些,您可以使用itemgetter
模块中的operator
来获取所有值为HOST_INSTITUTION
的值。
import csv
def csv_to_dict(file_name='data.csv'):
result = {}
with open(file_name, 'r') as file:
reader = csv.DictReader(file, delimiter=' ', skipinitialspace=True,fieldnames=('STUDENT_SUBJECT_AREA_VALUE','STUDENT_LEVEL','HOST_INSTITUTION'))
from operator import itemgetter
res = map(itemgetter('HOST_INSTITUTION'),reader)[1:] #this will print ['UK', 'PT', 'FR', 'UK', 'PT']
return {each:res.count(each)for each in set(res)}
print csv_to_dict()
输出
{'FR': 1, 'UK': 2, 'PT': 2}