Python 仅将文本文件中的特定行添加到词典中
我想将文本文件中的特定行添加到字典中。我们的想法是将所有以AUD开头的行连同它们的键一起添加到AUD字典中。然后是CAD和下表 我尝试了一些搜索和添加小段的变体。我对答案很好奇,就像我对错误和它们的含义很好奇一样。我刚开始学习Python,如果我的尝试让你的眼睛流血,我向你道歉。非常感谢您抽出时间 这是.txt文件的格式 这把所有的东西都加到字典里了,我只想要AUDPython 仅将文本文件中的特定行添加到词典中,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我想将文本文件中的特定行添加到字典中。我们的想法是将所有以AUD开头的行连同它们的键一起添加到AUD字典中。然后是CAD和下表 我尝试了一些搜索和添加小段的变体。我对答案很好奇,就像我对错误和它们的含义很好奇一样。我刚开始学习Python,如果我的尝试让你的眼睛流血,我向你道歉。非常感谢您抽出时间 这是.txt文件的格式 这把所有的东西都加到字典里了,我只想要AUD with open('rates.txt') as f: for line in f: if line.startswi
with open('rates.txt') as f:
for line in f:
if line.startswith('AUD') == True: # returns true on pairs I want to add
AUD = dict(x.rstrip().split(None, 1) for x in f) #adds everything
else:
pass
print AUD
接下来,我尝试了这个返回“ValueError:需要超过1个值才能解包”
最后我在做这个,它返回'KeyError:'AUD_CHF'
AUD = {}
with open("rates.txt") as f:
for line in f:
if 'AUD_' in line:
key, value = line.strip().split('')
AUD [key].append(value)
print AUD
这应该能奏效。我更改了字符串“parser”,通过删除前面的“AUD_u”直接生成要转换的货币。您可以进一步改进您的脚本,方法是选择要编写的词典,将前3个字母作为词典名称。您在第一个示例中的表现非常接近 在
if
语句中不需要==True
,因为str.startswith()
返回一个布尔值,该值由if
计算。除此之外,我还纠正了一些压痕
AUD = {}
with open('rates.txt', 'r') as f:
for line in f:
if line.startswith('AUD'):
split_line = line.split()
AUD[split_line[0]] = split_line[1]
else:
pass
print AUD
你离答案不远。 一定要清理数据。 文件通常以空行结尾,这可能会导致拆分失败
data = """
AUD_CHF 0.77324
AUD_EUR 0.72657
AUD_GBP 0.61557
AUD_JPY 86.88
AUD_USD 0.76835
CAD_EUR 0.722459831
CAD_GBP 0.612726326
CAD_CHF 0.76915
CHF_EUR 0.939858457
CHF_GBP 0.795924865
"""
#remove empty lines
lines = [l for l in (line.strip() for line in data.split('\n')) if l ]
AUD = {}
for line in lines:
#the two folowing lines could be in a function
curencies, rate = line.split()
cur1, cur2 = curencies.split('_')
#debug
#print cur1, '->', cur2, ' ', value
if cur1 == 'AUD':
AUD[cur2] = rate
for currency, rate in AUD.items():
print '1 AUD =', rate, currency
在您的核心中,只需将data.split('\n')替换为file.readlines()。谢谢您的时间。。。。我看到了“ValueError:需要超过1个值才能解包”。在我的原始版本中,append也不是必需的,所以很高兴知道这一点。再次感谢出现这种情况,当split()只返回一个值时,因为无法拆分行(例如空行等)。解决这个问题的方法是试着抓住循环中的线,或者测试你的线是否有空线等等……谢谢。又好又容易。我可以看到我在哪里使用了错误的代码。再次感谢。很高兴能提供帮助,如果此答案对您或其他人有用,请您将其标记为已接受的答案。请您解释一下行AUD[split_line[0]=split_line[1]我看到了AUD[add this entry],但我不理解索引谢谢(再次)
split_line=line.split()
将在空白处拆分该行,根据文本文件,列表中有两个元素,因此AUD_EUR 0.72657
将变成[AUD_EUR,0.72657]
。列表中的第一项(split_-line[0]
)是以AUD
开头的字符串,列表中的第二项是关联值(split_-line[1]
)。谢谢您的注释,这样我就可以看到每一行都在做什么了。这离我想要它做的事情更近了。。。。还感谢您提供有关清理数据的提示。
AUD = {}
with open('rates.txt', 'r') as f:
for line in f:
if line.startswith('AUD'):
split_line = line.split()
AUD[split_line[0]] = split_line[1]
else:
pass
print AUD
data = """
AUD_CHF 0.77324
AUD_EUR 0.72657
AUD_GBP 0.61557
AUD_JPY 86.88
AUD_USD 0.76835
CAD_EUR 0.722459831
CAD_GBP 0.612726326
CAD_CHF 0.76915
CHF_EUR 0.939858457
CHF_GBP 0.795924865
"""
#remove empty lines
lines = [l for l in (line.strip() for line in data.split('\n')) if l ]
AUD = {}
for line in lines:
#the two folowing lines could be in a function
curencies, rate = line.split()
cur1, cur2 = curencies.split('_')
#debug
#print cur1, '->', cur2, ' ', value
if cur1 == 'AUD':
AUD[cur2] = rate
for currency, rate in AUD.items():
print '1 AUD =', rate, currency