Python &引用;TypeError:列表索引必须是整数,而不是str";:yaml.load_所有人?

Python &引用;TypeError:列表索引必须是整数,而不是str";:yaml.load_所有人?,python,yaml,Python,Yaml,我想解析具有以下数据结构的YAML文件: Version: 1 TxnCode: MPT MessageID: "FFH-18544-1388620740-795905" Recommendations: - {ReqSegFlightRef: [[1,2]],TotalPriceRef: 1,PriceInfoRef: 1} - {ReqSegFlightRef: [[3,4,2]],TotalPriceRef: 2,PriceInfoRe

我想解析具有以下数据结构的YAML文件:

    Version: 1
    TxnCode: MPT
    MessageID: "FFH-18544-1388620740-795905"
    Recommendations: 
     - {ReqSegFlightRef: [[1,2]],TotalPriceRef: 1,PriceInfoRef: 1}
     - {ReqSegFlightRef: [[3,4,2]],TotalPriceRef: 2,PriceInfoRef: 2}
     - {ReqSegFlightRef: [[5,4,2]],TotalPriceRef: 3,PriceInfoRef: 3}
    Flights: 
     - {OpCarrier: SN,MktCarrier: SN,FlightNb: 2902,DptDate: "0109",DptTime:     "09:30",ArrTime: "11:05",DptAirport: VIE,ArrAirport: BRU}
     - {OpCarrier: SN,MktCarrier: SN,FlightNb: 243,DptDate: "0109",DptTime: "12:15",ArrTime: "17:00",DptAirport: BRU,ArrAirport: FNA}
     - {OpCarrier: OS,MktCarrier: LH,FlightNb: 6325,DptDate: "0109",DptTime: "06:30",ArrTime: "07:35",DptAirport: VIE,ArrAirport: MUC}
    Prices: 
     - {TotalPrice: 1574.14,BaseAmount: 1368.00,TotalTaxe: 206.14,TotalSurcharge: 0.00,TotalFee: 0.00}
     - {TotalPrice: 1633.57,BaseAmount: 1368.00,TotalTaxe: 265.57,TotalSurcharge: 0.00,TotalFee: 0.00}
     - {TotalPrice: 1636.57,BaseAmount: 1368.00,TotalTaxe: 268.57,TotalSurcharge: 0.00,TotalFee: 0.00}
  LFSDetails: |
    PriceInfos: 
     - {FaresRef: [1,2],Price: {Total: 1574.14},Amount: {Total: 1368.00},Taxes:  {Total: 206.14},Surcharges: {Total: 0.00},Fees: {Total: 0.00}}
     - {FaresRef: [3,4,2],Price: {Total: 1633.57},Amount: {Total: 1368.00},Taxes: {Total: 265.57},Surcharges: {Total: 0.00},Fees: {Total: 0.00}}
     - {FaresRef: [3,4,2],Price: {Total: 1636.57},Amount: {Total: 1368.00},Taxes: {Total: 268.57},Surcharges: {Total: 0.00},Fees: {Total: 0.00}}
    ListCabinRequested: []
    FareInfo: 
     - {RBD: M,FareBasis: BFFOWAT,PTC: ADT,BreakPointId: N,Availability: 9,Cabin: W,FareType: OB}
     - {RBD: B,FareBasis: BFFOWAT,PTC: ADT,BreakPointId: Y,Availability: 9,Cabin: W,FareType: OB}
     - {RBD: B,FareBasis: BFFOWAT,PTC: ADT,BreakPointId: N,Availability: 9,Cabin: M,FareType: OB}
    Currency: EUR
我有以下代码,但在第20行有一个“TypeError:列表索引必须是整数,而不是str”:

def yaml_load_all(iStream,iCodeFilter=None):
    for ayamldoc in yaml.load_all(iStream):
        lfsWrapper = LFSWrapper(iCodeFilter)
        lfsDetails = ayamldoc['LFSDetails'] #line 20
        if lfsDetails is not None:
            ayamldoc['LFSDetails'] = yaml.load(lfsDetails)
        lfsWrapper.loadDict(ayamldoc)
        if lfsWrapper.isValid():
            yield lfsWrapper
(稍后我将调用此方法,并将iStream设置为sys.stdin以读取数据文件)

我想我在这里缺少了一些关于数据结构或yaml.load_的工作方式的基本信息


我遗漏了什么?

我猜你在使用PyYaml


load\u all
用于在单个文件中加载多个YAML文档,因此始终返回列表。您只有一个映射到Python dict的文档,所以您应该只使用
load

我猜您使用的是PyYaml


load\u all
用于在单个文件中加载多个YAML文档,因此始终返回列表。您只有一个映射到Python dict的文档,所以您应该只使用
load

您的示例是一个奇怪的YAML文件,如果不是无效的话,这使得这里发生的事情有点像猜测。它是有问题的YAML文件的原因是

LFSDetails: |
与之前和之后的线条相比,具有不同压痕(即凸出)的线条

直到
LFSDetails
之前,YAML文件似乎在顶层有一个映射。因此,最初的解决方案可能是用两个空格将
LFSDetails
推入,使其与之对齐。这将导致一个空字符串作为其文本块标量(由
|
引入),并且您的代码似乎依赖于YAML作为YAML中的文本块。因此,看起来
LFSDetails
后面的所有行后面的缩进都是正确的

要显示错误消息,YAML文件必须以短划线(序列指示器)开头,缩进3个空格:

   -
    Version: 1
  LFSDetails: |
    PriceInfos:
     - {FaresRef: [1,2],Price: {Total: 1574.14},Amount: {Total: 1368.00},Taxes:  {Total: 206.14},Surcharges: {Total: 0.00},Fees: {Total: 0.00}}
给出此错误(我去掉了不相关的中间映射项)。不过,这会解析,但会完全删除(
LFSDetails
imk_:

import ruamel.yaml as yaml

yaml_str = """\
   -
    Version: 1
  LFSDetails: |
    PriceInfos:
     - {FaresRef: [1,2],Price: {Total: 1574.14},Amount: {Total: 1368.00},Taxes:  {Total: 206.14},Surcharges: {Total: 0.00},Fees: {Total: 0.00}}
"""

for data in yaml.load_all(yaml_str):
    print(data)
    print data['LFSDetails']
给你:

[{'Version': 1}]
Traceback (most recent call last):
  File "try.py", line 54, in <module>
    print data['LFSDetails']
TypeError: list indices must be integers, not str
它将您作为输出:

<type 'dict'>
Y

Y


这是使用我是作者的方法完成的。它是PyYAML的增强版,使用它的结果应该是类似的。

您的示例是一个奇怪的YAML文件,如果不是无效的YAML文件,这使得这里发生的事情有点猜测。它是一个有问题的YAML文件的原因是

LFSDetails: |
与之前和之后的线条相比,具有不同压痕(即凸出)的线条

直到
LFSDetails
之前,YAML文件看起来像是在顶层有一个映射。因此,最初的解决方案可能是用两个空格将
LFSDetails
推入,使其与之对齐。这将导致一个空字符串作为其文本块标量(由
|
引入,您的代码似乎依赖于YAML作为YAML中的文本块。因此,
LFSDetails
后面的所有行后面的缩进看起来都是正确的

要显示错误消息,YAML文件必须以短划线(序列指示器)开头,缩进3个空格:

   -
    Version: 1
  LFSDetails: |
    PriceInfos:
     - {FaresRef: [1,2],Price: {Total: 1574.14},Amount: {Total: 1368.00},Taxes:  {Total: 206.14},Surcharges: {Total: 0.00},Fees: {Total: 0.00}}
给出此错误(我去掉了不相关的中间映射项)。不过,这会解析,但会完全删除(
LFSDetails
imk_:

import ruamel.yaml as yaml

yaml_str = """\
   -
    Version: 1
  LFSDetails: |
    PriceInfos:
     - {FaresRef: [1,2],Price: {Total: 1574.14},Amount: {Total: 1368.00},Taxes:  {Total: 206.14},Surcharges: {Total: 0.00},Fees: {Total: 0.00}}
"""

for data in yaml.load_all(yaml_str):
    print(data)
    print data['LFSDetails']
给你:

[{'Version': 1}]
Traceback (most recent call last):
  File "try.py", line 54, in <module>
    print data['LFSDetails']
TypeError: list indices must be integers, not str
它将您作为输出:

<type 'dict'>
Y

Y


这是使用我是作者的方法完成的。这是PyYAML的增强版,使用它的结果应该类似。

可以提供完整的回溯,请。您可以编辑您的问题来添加它。请阅读并遵循指南。可以提供完整的回溯,请。您可以编辑您的问题来添加它。请阅读并请遵守指导方针。