1

我有以下格式的 .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:75019,AM:75021等。我是 python 新手(使用 2.6),不知道如何做到这一点。我搜索并发现了多个不完全有意义的答案,因为有多个列。

4

5 回答 5

1

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

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

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

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']}
于 2018-04-24T18:00:50.100 回答
1

按照以下步骤并获得预期的响应作为输出数组

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

f = open('file.txt', 'r')
content = f.read()
allLines = content.split('\n')
output = []
for singleLine in allLines:
    singleLine = singleLine.split('|')
    extractedJSON = {}
    extractedJSON[singleLine[0]] = singleLine[1]
    output.append(extractedJSON)
print "output"
print output
f.close()

我附上了运行代码的图像。显示运行代码的图像

于 2018-04-24T18:14:49.890 回答
0

我只想提取第一个列以用作键:值。例如,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]:
于 2018-04-24T17:08:55.710 回答
0

您可能想使用拆分功能

使用“|” 您将为每一行获得几个标记的分隔符。出于您的目的,您只需要使用前两个。

这是一个小片段

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 您可以在此代码段中添加错误控制!

请注意,这是执行此操作的最 Pythonic 方式(请参阅其他答案)

于 2018-04-24T16:54:48.480 回答
0

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

with open('somefile.txt', 'r') as f:
    d = {line.split('|')[0]: line.split('|')[1] for line in f}
于 2018-04-24T16:55:12.833 回答