Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅将文本文件中的特定行添加到词典中_Python_Python 2.7_Dictionary - Fatal编程技术网

Python 仅将文本文件中的特定行添加到词典中

Python 仅将文本文件中的特定行添加到词典中,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

我想将文本文件中的特定行添加到字典中。我们的想法是将所有以AUD开头的行连同它们的键一起添加到AUD字典中。然后是CAD和下表

我尝试了一些搜索和添加小段的变体。我对答案很好奇,就像我对错误和它们的含义很好奇一样。我刚开始学习Python,如果我的尝试让你的眼睛流血,我向你道歉。非常感谢您抽出时间

这是.txt文件的格式

这把所有的东西都加到字典里了,我只想要AUD

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