在python中从文件检索字典键时出错
关于SO也有类似的问题/答案,但这指的是一个特定的错误,我参考了相关SO主题来解决这个问题,但没有运气 我的代码试图从文本文件中检索行并将它们读入字典。它是有效的,但正如你在下面看到的,它并不完全有效 文件在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
"['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