2017-10-27 19 views
0

私は周期的な要素のプロパティのためのデータベースとしてテキストファイルを持っています。 | 2〜ヘリウム〜彼~~ 1 4.002〜18 | 3〜リチウム〜李~~ 1〜2 6.94Pythonで区切り文字でリストにテキストファイルを構文解析

1〜水素〜H〜1.008〜1〜1:次のようになります異なる要素を分離します|

のように...私はこのようになりますリストに全体のことを解析しようとしています :

[ "1〜水素〜H〜1.008〜1〜1"、 "2〜ヘリウム〜彼〜4.002〜18〜1"、 "3〜リチウム〜李〜6.94〜1〜2"]

これは持っているコードで、私は意図的にそれをクラスを作っています:

class Parser: 
    def __init__(self, path): 
     self.file = open(path, "r") 
     self.unparsed_info = self.file.read() 
     self.element_list = [''] 

    def parse_file(self, delimiter): 
     for elements in self.unparsed_info.split(delimiter): 
      self.element_list.insert(eval(elements.strip(delimiter))) 

    def print_unparsed(self): 
     print(self.unparsed_info) 

    def print_parsed(self): 
     print(self.element_list) 

    def close_file(self): 
     self.file.close() 

Element_properties = Parser("element_properties.txt") 
Element_properties.parse_file('|') 
Element_properties.print_parsed() 
Element_properties.close_file() 

しかし、多くの人が言っているように、これはテキストファイル全体をリストのすべての要素に印刷します。 parse_file関数を変更して、element_listの各要素に1つのセグメントしか入れないようにするにはどうすればよいですか?たぶん、このような

+0

は、なぜあなたは 'eval'が必要なのでしょうか? – Unatiel

+0

parse_file unparsed_infoをclassmethod内のself.unparsed_infoで参照できるときに、なぜparse_file unparsed_infoを渡すのですか? – UglyCode

+0

@Unatiel私はそうは思わない。これは、うまくいかなかった別の質問から回答を修正する試みでした。 –

答えて

0

def parse_file(self, delimiter):  
     self.element_list = [x for x in self.unparsed_info.split(delimiter) if len(x) > 0] 
1

私はちょうどself.element_listに追加します。つまり、このようになります:

def __init__(self, path): 
    self.file = open(path, "r") 
    self.unparsed_info = self.file.read() 
    self.element_list = [] # Make an empty list 

def parse_file(self, string, delimiter): 
    for elements in string.split(delimiter): 
     e = elements.strip(delimiter) 
     if e != '': # Check for empty strings 
      self.element_list.append(e) #Append to list 

は、ここに私の出力です:

['1~Hydrogen~H~1.008~1~1', '2~Helium~He~4.002~18~1', '3~Lithium~Li~6.94~1~2'] 
関連する問題