2017-06-07 8 views
-2

In einem der Programme, die ich verwende, bekomme ich eine TypeError beim Versuch, einen Wert aus dict type Daten zu minen/zu analysieren.Wie behebt man den TypeError (Listenindizes müssen ganze Zahlen sein, nicht str) in diesem Programm?

Nachfolgend finden Sie ein kurzer Teil des Python-Programms:

for c in results: 
     print('value of c : ', c, type(c)) # what I added to see the issue with dict data 
     for ci, lr in c['chain_info'].iteritems(): 
      outfile = open(lr.output_file, 'a') 
      write = outfile.write 

      if lr.number_vcf_lines > 0: 
       write(CHAIN_STRING.format(CHAIN_STRING, 
          from_chr=c['chrom'], from_length=lr.chromosome_length, 
          from_start=0, from_end=lr.chromosome_length, 
          to_chr=c['chrom'], to_length=lr.end_length, 
          to_start=0, to_end=lr.sums[0] + lr.last_fragment_size + lr.sums[2], id=c['chrom'])) 
       write("\n") 

Voll Nachricht Zurückverfolgungsfehler

Error Type: <type 'exceptions.TypeError'> 
Error Value: list indices must be integers, not str 
/home/everestial007/anaconda3/envs/g2gtools/lib/python2.7/site-packages/g2gtools/vcf2chain.py:456 
Traceback (most recent call last): 
    File "/home/everestial007/anaconda3/envs/g2gtools/bin/g2gtools", line 4, in <module> 
__import__('pkg_resources').run_script('g2gtools==0.1.31', 'g2gtools') 
    File "/home/everestial007/anaconda3/envs/g2gtools/lib/python2.7/site-packages/setuptools-27.2.0-py2.7.egg/pkg_resources/__init__.py", line 744, in run_script 
    File "/home/everestial007/anaconda3/envs/g2gtools/lib/python2.7/site-packages/setuptools-27.2.0-py2.7.egg/pkg_resources/__init__.py", line 1499, in run_script 
    File "/home/everestial007/anaconda3/envs/g2gtools/lib/python2.7/site-packages/g2gtools-0.1.31-py2.7.egg-info/scripts/g2gtools", line 117, in <module> 
    G2GToolsApp() 
    File "/home/everestial007/anaconda3/envs/g2gtools/lib/python2.7/site-packages/g2gtools-0.1.31-py2.7.egg-info/scripts/g2gtools", line 75, in __init__ 
    getattr(self, args.command)() 
    File "/home/everestial007/anaconda3/envs/g2gtools/lib/python2.7/site-packages/g2gtools-0.1.31-py2.7.egg-info/scripts/g2gtools", line 90, in vcf2chain 
    g2gtools.g2g_commands.command_vcf2chain(sys.argv[2:], self.script_name + ' vcf2chain') 
    File "/home/everestial007/anaconda3/envs/g2gtools/lib/python2.7/site-packages/g2gtools/g2g_commands.py", line 375, in command_vcf2chain 
    vcf2chain(args.input, args.fasta, args.strain, args.output, args.keep, args.passed, args.quality, args.diploid) 
    File "/home/everestial007/anaconda3/envs/g2gtools/lib/python2.7/site-packages/g2gtools/vcf2chain.py", line 493, in vcf2chain 
    raise G2GError("Execution halted") 
g2gtools.exceptions.G2GError: Execution halted 

Die Github Speicherort der Datei: https://github.com/churchill-lab/g2gtools/blob/master/g2gtools/vcf2chain.py

wie Problem Looks mit der Zeile:

from_chr=c['chrom'], from_length=lr.chromosome_length, 

Und der Chain_string etwas Autor erstellt als:

CHAIN_STRING = "chain 1000 {from_chr} {from_length} + {from_start} {from_end} " + "{to_chr} {to_length} + {to_start} {to_end} {id}" 

ich die Werte dieser dict zu drucken versucht (durch eine print-Anweisung hinzufügen), um zu sehen, was das Problem war.

print('value of c : ', c, type(c)) # gave me 
('value of c : ', {'chrom': '1', 'stats': OrderedDict([('ACCEPTED', 0)]), 'chain_info': {'right': <g2gtools.vcf2chain.VCFtoChainInfo object at 0x7fe9de396dd0>, 'left': <g2gtools.vcf2chain.VCFtoChainInfo object at 0x7fe9d9252d50>}}, <type 'dict'>) 

Also, was ist das Problem hier? Was ist das Problem mit diesem Daten/Programm?

+0

Eine vollständige Traceback wäre nützlich. – glibdud

+0

@glibdud: Ich dachte, die Leute würden nach einer vollständigen Rückverfolgung fragen, aber manchmal werfen lange Fragen keine Aufmerksamkeit auf sich. Ich habe nur den kompletten Traceback gesetzt. – everestial007

+0

Ich würde die vollständige Traceback nach dem Code empfehlen –

Antwort

0

In Ihrem Kommentar sagen Sie c ist ein String, dann from_chr=c['chrom'] funktioniert nicht, weil Sie eine Zeichenfolge einen Index, der eine Zeichenfolge ist nicht geben können.

In [3]: c = 'my string' 

In [4]: c['chrom'] 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-a201470ce4c5> in <module>() 
----> 1 c['chrom'] 

TypeError: string indices must be integers 

Ihre Fehlermeldung lautet list indices must be integers, not str. Ich denke, c ist eine Liste dann. In beiden Fällen können Sie c keinen String als Index angeben.

+0

c ist 'dict type 'in der Startphase for-loop 'für c in result's, aber' list type' in der write-Anweisung (nach 'if lr.number_vcf_lines> 0:'). – everestial007

+0

wie ist das möglich? Wo hat 'c' seinen Typ geändert? – gefei

+0

Ich versuchte 'versuchen, außer TypeError', um es zu testen, und das scheint der Fall in diesem Programm zu sein. Es ist komisch, ich bin auch überrascht. – everestial007

0

Problem war, dass in dem Verfahren für die Schleife, die als variable c Liste zurückkehrte:

for c in lr.chain_entries: 
    write("\t".join(map(str, c))) 
    write("\n") 

die c als Liste zurückgegeben werden, wenn eine weitere Zeile zu lesen. Ich musste c['chrom'] von mir erwarten, dass es ein dict type ist. Aber diese Variable wurde geändert, indem Forloop den ganzen Ärger verursachte.

Verwandte Themen