将某些列转换为python字典
我有一个大致如下的CSV文件:将某些列转换为python字典,python,python-2.7,csv,dictionary,Python,Python 2.7,Csv,Dictionary,我有一个大致如下的CSV文件: STUDENT_SUBJECT_AREA_VALUE | STUDENT_LEVEL | HOST_INSTITUTION 222 1 UK 58 1 PT 222 1 FR 223
STUDENT_SUBJECT_AREA_VALUE | STUDENT_LEVEL | HOST_INSTITUTION
222 1 UK
58 1 PT
222 1 FR
223 1 UK
222 1 PT
{UK: 2, PT: 2, FR: 1}
def csv_to_dict(file_name):
with open(file_name, 'rU') as file:
reader = csv.DictReader(file, delimiter=',')
return [line for line in reader]
我需要做的是从“寄宿机构”列中获取值,并计算该值出现的次数。输出应该是如下所示的字典:
STUDENT_SUBJECT_AREA_VALUE | STUDENT_LEVEL | HOST_INSTITUTION
222 1 UK
58 1 PT
222 1 FR
223 1 UK
222 1 PT
{UK: 2, PT: 2, FR: 1}
def csv_to_dict(file_name):
with open(file_name, 'rU') as file:
reader = csv.DictReader(file, delimiter=',')
return [line for line in reader]
我曾尝试将CSV文件转换为字典,但该文件非常大,我只需要该特定列。有没有办法浏览CSV并只阅读我需要的专栏?
我正在将CSV文件转换为dict,如下所示:
STUDENT_SUBJECT_AREA_VALUE | STUDENT_LEVEL | HOST_INSTITUTION
222 1 UK
58 1 PT
222 1 FR
223 1 UK
222 1 PT
{UK: 2, PT: 2, FR: 1}
def csv_to_dict(file_name):
with open(file_name, 'rU') as file:
reader = csv.DictReader(file, delimiter=',')
return [line for line in reader]
但这样我就不必要地浏览了所有的专栏。如果我不太清楚,请随时提问。除非这真的是性能瓶颈,否则您可能需要逐行将所有列读取到内存中。与您的解决方案不同,这不会将整个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})
为了提高性能,您可能需要尝试pandas。 例如:
import pandas as pd
d = pd.read_csv("bla.txt")
d.groupby("HOST_INSTITUTION").count(["STUDENT_SUBJECT_AREA_VALUE"].to_dict()
将产生所需的结果:)
shell方式:
awk'{print$3}'csv_file_path | sort | uniq-c
您的csv文件用多个空格分隔
如果您不想使用计数器:
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(键,默认值)
,如果键不存在,它将返回默认值
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
使用
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
有了它,您可以使用operator
模块中的itemgetter
来获取键名为HOST\u 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}
不幸的是,我在“key=row[2]”中得到一个列表索引超出范围错误@Stagg抱歉我的错误。您的csv文件由多个空格分隔。它不是完美的csv格式。等等minute@Stagg知道了。只需添加
skipinitialspace
参数。@Stagg在for循环中,您需要添加一个条件来检查行(如果行:
)是否为空。基本上,OPs输入文件包含空行,这会抛出异常。如果您使用与OP共享的相同输入文件,即使您也会遇到相同的异常。很巧,我在“key=row[2]”@Stagg中得到一个列表索引超出范围错误,您的CSV可能结构不好。你能粘贴它的前10行吗?CSV很长,我没有从这里加载它:。这是“伊拉斯谟学生流动性原始数据(2012-13年的学习交流和工作安排)”之一。你能提供前10行吗?