2017-04-25 10 views
0

は、私のファイルの内容を考える:文字列のリストから来た文字列をフォーマットする際のPythonエラー?

"ID","Name","Type 1","Type 2","Generation","Legendary" 
1,"Bulbasaur","Grass","Poison",1,"FALSE" 
6,"Charizard","Fire","Flying",1,"FALSE" 
4,"Charmander","Fire","",1,"FALSE" 
169,"Crobat","Poison","Flying",2,"FALSE" 
146,"Moltres","Fire","Flying",1,"TRUE" 
643,"Reshiram","Dragon","Fire",5,"TRUE" 
641,"Tornadus, (Incarnate Form)","Flying","",5,"TRUE" 

私はreadlines()を使用し、独自の行として各文字列のリストを作成します。

それから私は、これらの文字列を取ると、以下の形式にフォーマットしよう:

'Bulbasaur': (1, 'Grass', 'Poison', 1, False) 

私は正確な引用が正確であり、すべての小文字と大文字のが正しいことを確認する必要があります。私はまた、タイプが必要なものに作られていることを保証しなければなりません。私は、文字列(すなわち、ストリップおよびスプリット)を繰り返すか、フォーマットする行くとき

、私はいくつかのエラーを受け付けております:

TypeError: 'int' object is not iterable 
AttributeError: 'int' object has no attribute 'split' 

私はこれが機能する必要がどのようにと真剣に混乱しています。私の全体的な機能は実行されますが、正しい結果が返されません。例:bulbasaurの代わりにcharmanderの情報を辞書に返します。

  • Iはreadlines(からの結果を取る)と、列として各行を取得する必要が私はフォーマット、私はする必要があることたら私は、
  • の上方に設けられたフォーマットにその文字列をフォーマットする必要
  • それを辞書にする。ここで

あらゆる場所に実際にある私の関数である:ビルトインcsvモジュールを使用して

def read_info_file(filename): #accept file 
    file= open(filename) 
    lines=file.readlines()[1:] #skip first header line 
    d={} 
    for line in lines: 
     split_line=line.split(',') #get individual strings 
     legendary=True 
     if 'F' == split_line[-1].strip('"')[0]: #check last position if t or f to format legendary correctly 
     legendary=False 

     if len(split_line) > 6: 
      (k,v)=(split_line[1]+split_line[2].strip('"'), #puts right order and removes excess quotations 
(int(split_line[0]),split_line[3].strip('"'),split_line[4].strip('"'), 
     int(split_line[5]),legendary)) 

     else: 
      (k,v)=(split_line[1].strip('"'), 
(int(split_line[0]),split_line[2].strip('"'),split_line[3].strip('"'), 
      int(split_line[4]),legendary)) 

    d.update([(k,v)]) 
    file.close() 
    return d 

答えて

1

は、物事を簡素化:

import csv 
from pprint import pprint 

def read_info_file(filename): 
    with open(filename,'r',newline='') as f: 
     r = csv.reader(f) 
     next(r) # skip header 
     d = {} 
     for id,name,type1,type2,generation,legendary in r: 
      d[name] = int(id),type1,type2,int(generation),legendary=='TRUE' 
    return d 

pprint(read_info_file('input.txt')) 

出力

{'Bulbasaur': (1, 'Grass', 'Poison', 1, False), 
'Charizard': (6, 'Fire', 'Flying', 1, False), 
'Charmander': (4, 'Fire', '', 1, False), 
'Crobat': (169, 'Poison', 'Flying', 2, False), 
'Moltres': (146, 'Fire', 'Flying', 1, True), 
'Reshiram': (643, 'Dragon', 'Fire', 5, True), 
'Tornadus, (Incarnate Form)': (641, 'Flying', '', 5, True)} 
+0

私はそれをやりたい!残念ながら、インポートされたモジュールは使用できません。 –

+0

@ ocean.1234あなたはパーサを書くつもりですか?最後のデータ項目には引用符で埋め込まれたカンマがあるので、単純な 'line.split( '、')'は機能しません。 –

+0

パーサーは何ですか? –

関連する問題