将包含多列的txt文件转换为字典

时间:2018-04-24 16:48:05

标签: python dictionary python-2.6 delimited-text

我有一个.txt文件,格式如下:

AM|75019|Caribbean from 15N to 18N between 80W and 85W|18.757950|-81.741300
AM|75021|Caribbean from 15N to 18N between 72W and 80W|18.757950|-81.741300
AM|75015|Caribbean approaches to the Windward Passage|15.133340|-68.139050

我想只提取前两列用作key:value。例如,AM:75019AM:75021等。我是python的新手(使用2.6),我不知道如何做到这一点。我搜索过并找到了多个答案,这些答案并不完全有意义,因为有多列。

5 个答案:

答案 0 :(得分:1)

Python中的字典不能有重复的键,因此您可以做的最接近的事情是存储与每个键关联的值列表。

您的文件由字符分隔值组成,因此使用Python的csv模块会将文件解析为单独的字段。

这是实现你想要的一种方式。请注意,您还可以使用添加到Python v2.5中的collections.defaultdict类,而不是定义自己的类,如下所示:

import csv
from pprint import pprint

class ListDict(dict):
    """ Dictionary who's values are lists. """
    def __missing__(self, key):
        value = self[key] = []
        return value

filename = 'multi_col.csv'

lstdct = ListDict()
with open(filename, 'rb') as csvfile:
    for row in csv.reader(csvfile, delimiter='|'):
        key, value = row[:2]
        lstdct[key].append(value)

pprint(lstdct)  # -> {'AM': ['75019', '75021', '75015']}

答案 1 :(得分:1)

按照以下步骤操作,将预期响应作为输出数组

将file.txt添加到项目结构中   - 在新的extractinfo.py中添加以下代码   - 执行它

SoundPool.load()

我附上了运行代码的图像。Image Showing running code

答案 2 :(得分:0)

您可能想要使用split function

使用'|'你将为每一行获得几个令牌的分隔符。为了您的目的,您只需要使用前两个。

这是一个小片段

ze_dict = {}
ze_file = open(my_file_path, 'r')
ze_lines = ze_file.read().splitlines()
for l in ze_lines:
    ze_tokens = l.split('|')
    ze_dict[ze_tokens[0]] = ze_tokens[1]
ze_file.close()

Ofc你可以在这个片段中添加错误控制!

请注意这是注意到这种方式最为诡辩的方法(见其他答案)

答案 3 :(得分:0)

以下代码可以满足您的需求:

with open('somefile.txt', 'r') as f:
    d = {line.split('|')[0]: line.split('|')[1] for line in f}

答案 4 :(得分:0)

  

我想只提取第一个用作键的值:value。对于   例如,AM:75019,AM:75021等......

如果密钥在dict中重复,则第二个键值对将覆盖第一个键值对,因为字典只能为每个键设置一个值。

如果想要使用相同键的值,可以查看defaultdict

以下是示例代码,

In [1]: from collections import defaultdict

In [2]: lines = tuple(open('test.txt', 'r'))

In [3]: data_dict = defaultdict(list)

In [4]: for line in lines:
   ...:     data_dict[line.split('|')[0]].append(line.split('|')[1])
   ...:

In [5]: data_dict
Out[5]: defaultdict(list, {'AM': ['75019', '75021', '75015']})

In [6]: