处理文件读取和字典中多个值的键

2 投票
2 回答
2260 浏览
提问于 2025-04-16 04:09

我想知道怎么写代码来读取一个文件的第一行,并把它作为字典的一个键,然后继续读取下面的值,把它们放到对应的键下,形成一个字典。举个例子:

项目 质量 成本 地点

Ball     1        $12    TX
Umbrella 5        $35    NY
sweater  89       $100   LA

这里,表示的就是我的文件。当我读取时,我希望字典的键是加粗的那些内容,而在我继续读取下面的行时,这些行的内容会作为多个值放到相应的键下。

谢谢

2 个回答

1

看起来你在描述一个用空格分隔的csv文件。像这样的方法应该可以用得上(来自Python的帮助文档)。

>>> import csv
>>> spamReader = csv.reader(open('eggs.csv', 'rb'), delimiter=' ', quotechar='|')
>>> for row in spamReader:
...     print ', '.join(row)
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

其实,使用csv.DictReader会更好,这样每一行就可以变成一个字典,字典的键是由第一行定义的。

我假设每组值之间都有换行符。

编辑:根据上面的例子,我们可以得到:

In [1]: import csv

In [2]: f = csv.DictReader(open('test.txt', 'r'), delimiter = ' ', skipinitialspace = True)

In [3]: for row in f: print row

{'Item': 'Ball', 'Cost': '$12', 'Quality': '1', 'Place': 'TX'}
{'Item': 'Umbrella', 'Cost': '$35', 'Quality': '5', 'Place': 'NY'}
{'Item': 'sweater', 'Cost': '$100', 'Quality': '89', 'Place': 'LA'}

将参数skipinitialspace = True传给DictReader是必要的,这样可以去掉多个空格,而不会在每一行中产生多余的条目。

0

对于一个特定的键,你不能有“多个值”,但你当然可以让每个键对应一个值,这个值是一个列表。

举个例子(适用于Python 2.6或更高版本——我使用next函数是为了通用性,而不是像readline这样的特定方法,不过你当然可以根据需要调整!):

def makedictwithlists(f):
    keys = next(f).split()
    d = {}
    for k in keys: d[k] = []
    for line in f:
        for k, v in zip(keys, line.split()):
            d[k].append(v)
    return d

撰写回答