用Python访问yaml文件中的字段

2 投票
1 回答
3663 浏览
提问于 2025-04-18 10:09

我在网上找到了一些代码,想从文件中提取字段。这是我常用的一个 .yaml 文件的样子:

  - id:
    bioguide: B000226
    govtrack: 401222
    icpsr: 507
  name:
    first: Richard
    last: Bassett
  bio:
    birthday: '1745-04-02'
    gender: M
  terms:
  - type: sen
    start: '1789-03-04'
    end: '1793-03-02'
    state: DE
    class: 2
    party: Anti-Administration

我大约有12000个这样的文件想要解析,一旦我理解了一个文件,接下来的工作就简单多了。目前我只是想做一些简单的事情,比如从文件中获取一个人的名字,所以我尝试了这个:

for filename in os.listdir(currentPath):
            print filename
            if(filename.endswith(".yaml")):
                with open(os.path.join(currentPath, filename)) as myFile:
                    results = yaml.load(myFile)
                    try:
                        print results["name"]["first"]
                    except:
                        print "Problem"

如果我不处理异常,就会出现一个问题,我不太明白为什么,因为yaml文件不应该像json文件那样是个字典吗?看起来它把我当成了一个列表来处理。

print results["name"]["first"]
TypeError: list indices must be integers, not str

我好像缺少了一些基本的东西,眼下唯一的障碍就是从yaml中获取数据,如果能给我一些建议,我会非常感激。

编辑:

当我打印出12000个文件中的一个时,它的格式是这样的:

    [{'bio': {'gender': 'M', 'birthday': '1914-06-09'}, 'terms': [{'start': '1963-01-09', 'state': 'CA', 'end': '1964-10-03', 'district': 34, 'party': 'Democrat', 'type': 'rep'}, {'start': '1965-01-04', 'state': 'CA', 'end': '1966-10-22', 'district': 34, 'party':  'Democrat', 'type': 'rep'}, {'start': '1967-01-10', 'state': 'CA', 'end': '1968-10-14', 'district': 34, 'party': 'Democrat', 'type': 'rep'}, {'start': '1969-01-03', 'state': 'CA', 'end': '1971-01-02', 'district': 34, 'party': 'Democrat', 'type': 'rep'}, {'start': '1971-01-21', 'state': 'CA', 'end': '1972-10-18', 'district': 34, 'party': 'Democrat', 'type': 'rep'}, {'start': '1973-01-03', 'state': 'CA', 'end': '1974-12-20', 'district': 34, 'party': 'Democrat', 'type': 'rep'}], 'id': {'bioguide': 'H000164', 'icpsr': 10594, 'house_history': 14486, 'wikipedia': 'Richard T. Hanna', 'thomas': '00494', 'govtrack': 405046}, 'name': {'middle': 'Thomas', 'last': 'Hanna', 'first': 'Richard'}}]

如果你能帮我,教我如何访问一些内容,比如名字、开始和结束日期等,那将非常有帮助。

1 个回答

2

这样做可以吗?

try:
  print results[0]['name']['first']
except:
  print 'Problem'

撰写回答