【问题标题】:Convert txt file with multiple columns to dictionary将具有多列的txt文件转换为字典
【发布时间】:2018-04-24 16:48:05
【问题描述】:

我有一个格式如下的 .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),不知道该怎么做。我搜索并发现了多个不完全有意义的答案,因为有多个列。

【问题讨论】:

  • 这是不给你喂奶的伪算法答案:你需要找到一个字符来分隔你的列,然后对于每一行,使用这个分隔符分割这一行。然后你会得到一个字符串列表,你可以用它来创建你的字典。
  • 使用正则表达式!
  • 旁注,如果您是 Python 新手,请尽可能从 2.6 升级到更广泛的版本。 3.x 通常没问题,但即使是 2.7 也更好。

标签: python dictionary python-2.6 csv


【解决方案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']}

【讨论】:

  • 这确实有效,但我如何访问其中一个键值?我尝试了 lstdct.get("75013") 但得到的返回值为 None。
  • 每个键的值都存储在其关联列表中,因此lstdct.get('AM')(或lstdct['AM'])是它们的列表。可以通过指定整数索引来访问其中的各个项目。例如lstdct['AM'][0]lstdct['AM'][1] 等。您还可以使用 for flight in lstdct.get('AM', []): ... 之类的内容循环遍历它们。您还可以使用if 'AM' in lstdct: ... 之类的条件轻松检查某个键是否在字典中(并避免创建不需要的空列表)。
【解决方案2】:

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

将 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()

我附上了运行代码的图片

【讨论】:

    【解决方案3】:

    您可能想使用split function

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

    这是一个小sn-p

    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()
    

    你可以在这个 sn-p 中添加错误控制!

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

    【讨论】:

      【解决方案4】:

      以下代码将实现您想要的:

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

      【讨论】:

        【解决方案5】:

        我只想提取第一个列以用作键:值。为了 例如,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]:
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-26
          • 2021-04-25
          • 1970-01-01
          • 1970-01-01
          • 2022-06-15
          • 2017-04-11
          • 1970-01-01
          相关资源
          最近更新 更多