在python中从文件检索字典键时出错

在python中从文件检索字典键时出错,python,dictionary,key,Python,Dictionary,Key,关于SO也有类似的问题/答案,但这指的是一个特定的错误,我参考了相关SO主题来解决这个问题,但没有运气 我的代码试图从文本文件中检索行并将它们读入字典。它是有效的,但正如你在下面看到的,它并不完全有效 文件 "['a', 5]" "['b', 2]" "['c', 3]" "['d', 0]" def readfiletodict(): with open("testfile.txt","r",newline="") as f: mydict={} #create a dic

关于SO也有类似的问题/答案,但这指的是一个特定的错误,我参考了相关SO主题来解决这个问题,但没有运气

我的代码试图从文本文件中检索行并将它们读入字典。它是有效的,但正如你在下面看到的,它并不完全有效

文件

"['a', 5]"
"['b', 2]"
"['c', 3]"
"['d', 0]"
def readfiletodict():

   with open("testfile.txt","r",newline="") as f:
     mydict={} #create a dictionary called mydict
     for line in f:
        (key,val) = line.split(",")
        mydict[key]=val
     print(mydict) #test
     for keys in mydict:
       print(keys) #test to see if the keys are being retrieved correctly


readfiletodict()     
代码

"['a', 5]"
"['b', 2]"
"['c', 3]"
"['d', 0]"
def readfiletodict():

   with open("testfile.txt","r",newline="") as f:
     mydict={} #create a dictionary called mydict
     for line in f:
        (key,val) = line.split(",")
        mydict[key]=val
     print(mydict) #test
     for keys in mydict:
       print(keys) #test to see if the keys are being retrieved correctly


readfiletodict()     
所需输出:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux

{'"[\'a\'': ' 5]"\r\n', '"[\'b\'': ' 2]"\r\n', '"[\'c\'': ' 3]"\r\n', '"[\'d\'': ' 0]"\r\n'}
"['a'
"['b'
"['c'
"['d'
我希望字典能够保存:a、b、c、d和文件中所示的相应值,而不包含不需要的字符。类似地,我需要将值作为整数正确地存储在字典中(以便以后使用)

有关快速复制,请参阅:了解整个代码和问题

当前(错误)输出:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux

{'"[\'a\'': ' 5]"\r\n', '"[\'b\'': ' 2]"\r\n', '"[\'c\'': ' 3]"\r\n', '"[\'d\'': ' 0]"\r\n'}
"['a'
"['b'
"['c'
"['d'

我在当前代码中使用的Stackoverflow答案来自:但它对我来说不太管用…

如果在真正的python列表中转换字符串列表,那么就容易多了,因此不需要解析。使用json加载:

import json 

...
  list_line = json.loads(line)
...

希望有帮助

如果在真正的python列表中转换字符串列表,则更容易,因此不需要解析。使用json加载:

import json 

...
  list_line = json.loads(line)
...

希望有帮助

有效的方法是使用@Tico建议的python列表

然而,如果出于某种原因你不能,你可以试试这个

lineFormat=re.sub('[^A-Za-z0-9,]+','',第行)
这将把
“['a',5]”
转换为
a,5
。现在可以应用分割函数了

(key,val)=lineFormat.split(“,”)

mydict[key]=val

有效的方法是使用@Tico建议的python列表

然而,如果出于某种原因你不能,你可以试试这个

lineFormat=re.sub('[^A-Za-z0-9,]+','',第行)
这将把
“['a',5]”
转换为
a,5
。现在可以应用分割函数了

(key,val)=lineFormat.split(“,”)

mydict[key]=val

仅使用非常基本的Python知识:

>>> mydict = {}
>>> with open('temp.txt') as the_input:
...     for line in the_input:
...         values = line.replace('"', '').replace("'", '').replace(',', '').replace('[', '').replace(']', '').rstrip().split(' ')
...         mydict[values[0]] = int(values[1])
...         
>>> mydict
{'a': 5, 'b': 2, 'c': 3, 'd': 0}
换句话说,抛弃所有标点符号,只留下字典所需的两个值之间的空白。在空白处分开,然后把分开的部分放到字典里

编辑:以类似的方式,使用正则表达式。
re.sub
查找其第一个参数给出的各种可选字符,找到的任何字符都将替换为其第二个参数,即空字符串。在正则表达式模式中,替代项由“|”字符分隔。有些替代项,例如“[”,必须用“\”转义,因为它们本身在正则表达式中有特殊的含义

>>> mydict = {}
>>> with open('temp.txt') as the_input:
...     for line in the_input:
...         values = re.sub(r'"|\'|\,|\[|\]|,', '', line).split(' ')
...         mydict[values[0]] = int(values[1])
... 
>>> mydict
{'a': 5, 'b': 2, 'c': 3, 'd': 0}

仅使用非常基本的Python知识:

>>> mydict = {}
>>> with open('temp.txt') as the_input:
...     for line in the_input:
...         values = line.replace('"', '').replace("'", '').replace(',', '').replace('[', '').replace(']', '').rstrip().split(' ')
...         mydict[values[0]] = int(values[1])
...         
>>> mydict
{'a': 5, 'b': 2, 'c': 3, 'd': 0}
换句话说,抛弃所有的标点符号,只在词典所需的两个值之间留出空白。在空白处分裂,然后将碎片从字典中分割出来。

编辑:以类似的方式,使用正则表达式。
re.sub
查找其第一个参数给出的各种可选字符,找到的任何字符都被其第二个参数(空字符串)替换。可选字符由正则表达式模式中的“|”字符分隔。一些可选字符,例如[”,必须用“\”转义,因为它们本身在正则表达式中有特殊的含义

>>> mydict = {}
>>> with open('temp.txt') as the_input:
...     for line in the_input:
...         values = re.sub(r'"|\'|\,|\[|\]|,', '', line).split(' ')
...         mydict[values[0]] = int(values[1])
... 
>>> mydict
{'a': 5, 'b': 2, 'c': 3, 'd': 0}

你差一点就到了,错过了两件事:

  • 剥去钥匙
  • 转换值
以下代码满足您的需要(我认为):


但是,请小心,因为此代码非常脆弱。它不会处理您正确提供的输入格式的任何变化。要在此基础上进行构建,我建议至少使用除ValueError之外的
进行int转换,并再次考虑剥离字符。

您几乎做到了,缺少两件事:

  • 剥去钥匙
  • 转换值
以下代码满足您的需要(我认为):


但是要小心,因为这段代码非常脆弱。它不会处理您正确提供的输入格式的任何变化。要在此基础上进行构建,我建议至少使用除ValueError之外的
进行int转换,并再次考虑剥离字符。

您的代码稍微修改了一下-关键是撕掉所有我们不在乎的字符():

输出


您的代码稍有修改-关键是去掉所有我们不关心的字符():

输出


您可以使用
regex
和dict理解来实现这一点:

#!/usr/bin/env python

import re

with open('file.txt', 'r') as f: l = f.read().splitlines()
d = {''.join(re.findall('[a-zA-Z]+',i)):int(''.join(re.findall('\d',i))) for i in l}
结果:

{'a': 5, 'c': 3, 'b': 2, 'd': 0}

您可以使用
regex
和dict理解来实现这一点:

#!/usr/bin/env python

import re

with open('file.txt', 'r') as f: l = f.read().splitlines()
d = {''.join(re.findall('[a-zA-Z]+',i)):int(''.join(re.findall('\d',i))) for i in l}
结果:

{'a': 5, 'c': 3, 'b': 2, 'd': 0}

谢谢,我需要在不使用json的情况下执行此操作。@Ekhumaro这是个粗鲁的家伙…无论如何。我已经测试过它了json。加载(“['a',2]”)返回['a',2]。哦..引号..好的,你需要先替换它。@Tico。用
“['a',5]”试试看
,如OP的问题所示。嘿@MissComputing we regex是anusha建议的!回答得好!@ekhumoro我切换了引号。好的。你还需要一步将引号从字符串中切换过来。无论如何,即使我没有测试过,这也太粗鲁了,老兄……你不应该这么做……谢谢,我需要在不使用json的情况下这样做。@ekhumoro这太粗鲁了,伙计……不管怎样。我已经测试过它了。加载(“[“a”,2]”)返回['a',2]。哦..引号..好的,你需要先替换它。@Tico。用
“['a',5]试试看。”
,如OP的问题所示。嘿@MissComputing we regex是anusha建议的!回答得好!@Ekhumro我切换了引号。好吧。你还需要一步从字符串中切换引号。不管怎样,即使我没有测试过,那也太粗鲁了,伙计……你不应该这么做……谢谢,我确实需要这本字典来解释各种原因ons.Ar