将 CSV 文件排序和重组为 python 字典
Sorting and reorganizing a CSV file as a python dictionary
我有一个 csv 文件,格式如下:
ComponentID subComponent Measurement
X030 A1111111 784.26
X030 A2222222 784.26
X015 A1111111 997.35
X015 A2222222 997.35
X015 A3333333 997.35
X075 A1111111 673.2
X075 A2222222 673.2
X075 A3333333 673.2
X090 A1111111 1003.2
X090 A2222222 1003.2
X090 A3333333 1003.2
X105 A1111111 34.37
X105 A2222222 34.37
X105 A3333333 34.37
X105 A4444444 34.37
我想return将文件作为python以下格式的字典:
my_dict = {'X030': ['A1111111', 'A2222222', 784.26],
'X015': ['A1111111', 'A2222222', 'A3333333', 997.35 ],
'X075': ['A1111111', 'A2222222', 'A3333333', 673.2],
'X090': ['A1111111', 'A2222222', 'A3333333', 1003.2],
'X105': ['A1111111', 'A2222222', 'A3333333', 'A4444444', 34.37]
}
最初,我是使用 itertools.groupby 查看它的,但这并没有让我有任何进展。我的困惑在于如何设计它,因为我不确定如何 return 以下项目:ComponentID: [components, and only one measurement]
我不确定如何完成这项任务,欢迎任何指导
您可以遍历 csv
行并使用 dict.setdefault
方法将行存储在字典中:
>>> import csv
>>> d={}
>>> with open('your_file.csv', newline='') as csvfile:
... spamreader = csv.reader(csvfile, delimiter='\t')
... for row in spamreader:
... d.setdefault(row[0],[]).extend(row[1:])
... print d
我的方法是:
myData = {}
with open('p.csv') as inputfile:
for line in inputfile:
if ('ComponentID' not in line):
row = [x.strip() for x in line.split(' ')]
cid = row[0]
sub = row[1]
msmt = row[2]
if cid in myData.keys():
msmt = myData[cid][-1]
myData[cid] = myData[cid][:-1]
myData[cid].append(sub)
myData[cid].append(msmt)
else:
myData[cid] = row[1:]
print myData
我在理解开始时的数据结构时遇到了一些问题:是否保证任何给定 ComponentID 的所有子组件都具有相同的度量值?如果是这样,那么给定的 TSV 格式和您想要的 dict 都不是用于存储此信息的非常合理的数据结构。
尽管如此,这里有一些简单的代码可以完全满足您的要求:
d = {}
with open('yourfile.tsv') as tsvfile:
next(tsvfile)
for line in tsvfile:
row = line.split()
componentid, subcomponent, measurement = row[0], row[1], float(row[2])
if not componentid in d:
d[componentid] = [subcomponent, measurement]
else:
assert measurement == d[componentid][-1]
d[componentid] = d[componentid][:-1] + [subcomponent, measurement]
下面是一些代码,将其置于更符合逻辑的结构中:
d = {}
with open('yourfile.tsv') as tsvfile:
next(tsvfile)
for line in tsvfile:
row = line.split()
componentid, subcomponent, measurement = row[0], row[1], float(row[2])
if not componentid in d:
d[componentid] = {'subcomponents': [subcomponent], 'measurement': measurement}
else:
assert measurement == d[componentid]['measurement']
d[componentid]['subcomponents'] += [subcomponent]
这给了你
{
'X105': {'measurement': 34.37, 'subcomponents': ['A1111111', 'A2222222', 'A3333333', 'A4444444']},
'X015': {'measurement': 997.35, 'subcomponents': ['A1111111', 'A2222222', 'A3333333']},
'X075': {'measurement': 673.2, 'subcomponents': ['A1111111', 'A2222222', 'A3333333']},
'X030': {'measurement': 784.26, 'subcomponents': ['A1111111', 'A2222222']},
'X090': {'measurement': 1003.2, 'subcomponents': ['A1111111', 'A2222222', 'A3333333']}
}
我有一个 csv 文件,格式如下:
ComponentID subComponent Measurement
X030 A1111111 784.26
X030 A2222222 784.26
X015 A1111111 997.35
X015 A2222222 997.35
X015 A3333333 997.35
X075 A1111111 673.2
X075 A2222222 673.2
X075 A3333333 673.2
X090 A1111111 1003.2
X090 A2222222 1003.2
X090 A3333333 1003.2
X105 A1111111 34.37
X105 A2222222 34.37
X105 A3333333 34.37
X105 A4444444 34.37
我想return将文件作为python以下格式的字典:
my_dict = {'X030': ['A1111111', 'A2222222', 784.26],
'X015': ['A1111111', 'A2222222', 'A3333333', 997.35 ],
'X075': ['A1111111', 'A2222222', 'A3333333', 673.2],
'X090': ['A1111111', 'A2222222', 'A3333333', 1003.2],
'X105': ['A1111111', 'A2222222', 'A3333333', 'A4444444', 34.37]
}
最初,我是使用 itertools.groupby 查看它的,但这并没有让我有任何进展。我的困惑在于如何设计它,因为我不确定如何 return 以下项目:ComponentID: [components, and only one measurement]
我不确定如何完成这项任务,欢迎任何指导
您可以遍历 csv
行并使用 dict.setdefault
方法将行存储在字典中:
>>> import csv
>>> d={}
>>> with open('your_file.csv', newline='') as csvfile:
... spamreader = csv.reader(csvfile, delimiter='\t')
... for row in spamreader:
... d.setdefault(row[0],[]).extend(row[1:])
... print d
我的方法是:
myData = {}
with open('p.csv') as inputfile:
for line in inputfile:
if ('ComponentID' not in line):
row = [x.strip() for x in line.split(' ')]
cid = row[0]
sub = row[1]
msmt = row[2]
if cid in myData.keys():
msmt = myData[cid][-1]
myData[cid] = myData[cid][:-1]
myData[cid].append(sub)
myData[cid].append(msmt)
else:
myData[cid] = row[1:]
print myData
我在理解开始时的数据结构时遇到了一些问题:是否保证任何给定 ComponentID 的所有子组件都具有相同的度量值?如果是这样,那么给定的 TSV 格式和您想要的 dict 都不是用于存储此信息的非常合理的数据结构。
尽管如此,这里有一些简单的代码可以完全满足您的要求:
d = {}
with open('yourfile.tsv') as tsvfile:
next(tsvfile)
for line in tsvfile:
row = line.split()
componentid, subcomponent, measurement = row[0], row[1], float(row[2])
if not componentid in d:
d[componentid] = [subcomponent, measurement]
else:
assert measurement == d[componentid][-1]
d[componentid] = d[componentid][:-1] + [subcomponent, measurement]
下面是一些代码,将其置于更符合逻辑的结构中:
d = {}
with open('yourfile.tsv') as tsvfile:
next(tsvfile)
for line in tsvfile:
row = line.split()
componentid, subcomponent, measurement = row[0], row[1], float(row[2])
if not componentid in d:
d[componentid] = {'subcomponents': [subcomponent], 'measurement': measurement}
else:
assert measurement == d[componentid]['measurement']
d[componentid]['subcomponents'] += [subcomponent]
这给了你
{
'X105': {'measurement': 34.37, 'subcomponents': ['A1111111', 'A2222222', 'A3333333', 'A4444444']},
'X015': {'measurement': 997.35, 'subcomponents': ['A1111111', 'A2222222', 'A3333333']},
'X075': {'measurement': 673.2, 'subcomponents': ['A1111111', 'A2222222', 'A3333333']},
'X030': {'measurement': 784.26, 'subcomponents': ['A1111111', 'A2222222']},
'X090': {'measurement': 1003.2, 'subcomponents': ['A1111111', 'A2222222', 'A3333333']}
}