“TypeError:列表索引必须是整数,而不是str”:你要装什么?

2024-05-19 11:02:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想解析具有以下数据结构的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:list index must be integers,not str”:

^{pr2}$

(我稍后调用此方法,iStream设置为系统标准读取数据文件)。

我想我遗漏了一些关于数据结构或全部加载正在工作。在

我错过了什么?在


Tags: totalsnarrtimetotalpricedpttimereqsegflightrefbaseamountpriceinforef
2条回答

您的例子是一个奇怪的,如果不是一个无效的YAML文件,这使得它有点猜测工作在这里发生了什么。它是一个有问题的YAML文件的原因是

LFSDetails: |

与前后行相比,具有不同缩进(即突出)的线条。在

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

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

^{pr2}$

给出这个错误(我去掉了不相关的中间映射项)。但是,这将解析,但在输出后完全删除LFSDetails¹的任何内容:

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

由于破折号,以Version:开头的映射是序列/列表的第一个元素,然后尝试使用字符串(LFSDetails)访问列表元素会得到错误。在

因此,您应该首先清理您的山药,使其正确。我还建议包括start of document marker -),即使示例文件中只有一个文档,因为您使用的是load_all()。并去掉多余的缩进(即从行的第一列开始)。删除任何虚假序列后,开始破折号并得到如下结果:

import ruamel.yaml as yaml

yaml_str = """\
 -
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
"""

for data in yaml.load_all(yaml_str):
    lfs_data =  data['LFSDetails']
    nested_data = yaml.load(lfs_data)
    print(type(nested_data))
    print(nested_data['FareInfo'][1]['BreakPointId'])

它将您作为输出:

<type 'dict'>
Y

¹这是使用ruamel.yaml完成的,我是其中的作者。它是PyYAML的增强版,使用它的结果应该是相似的。

我想你用的是PyYaml。在

load_all用于在一个文件中加载多个YAML文档,因此总是返回一个列表。您只有一个文档,它映射到一个Python dict,所以应该使用load。在

相关问题 更多 >

    热门问题