2016-04-05 44 views
0

次のファイルを読み込んでいます。複数の区切り文字で区切る文字列

87965164,Paris,Yu,6/27/1997 
87965219,Heath,Moss,10/13/1996 
87965187,Cale,Blankenship,10/22/1995 
87965220,Terrence,Watkins,12/7/1996 
87965172,Ansley,Padilla,3/30/1997 

i「は、」で行を分割する必要があり、 『/』とも端から 『\ n』を削除します。

私はリストに入れたときに、私の出力は次のようになりたい:

[['87965164', 'Paris', 'Yu', 6, 27, 1997], ['87965219', 'Heath', 'Moss', 10, 13, 1996], ['87965187', 'Cale', 'Blankenship', 10, 22, 1995], ['87965220', 'Terrence', 'Watkins', 12, 7, 1996], ['87965172', 'Ansley', 'Padilla', 3, 30, 1997]] 
+3

何か試しましたか? – usr2564301

答えて

2

You're going to want regular expressions.

import re 

results = [] 
for line in fl: 
    # [,/] means "match if either a , or a/is present" 
    results.append(re.split('[,/]',line.strip())) 

あなたが特に大きなファイルがある場合、あなたは発電機でそれをラップすることができます。

import re 
def splitter(fl): 
    for line in fl: 
    # By using a generator, you are only accessing one line of the file at a time. 
    yield re.split('[,/]',line.strip()) 
0

各行:

parts = line.split(',') 
parts[-1:] = map(int, parts[-1].split('/')) 

これは、非日付部分にスラッシュを含む入力を正しく処理し、同時に整数への変換を容易に処理します。正規表現より

1

シンプル:

[line.replace('/', ',').split(',') for line in text.split('\n')] 

あなたはその後int Sに数字を変換することができます。

しかし、あなたは間違ったやり方を探していると思います。適切な方法はカンマで区切ってから、特別なフィールドに専用の処置を与えることです。

from datetime import datetime 
from collections import namedtuple 

Person = namedtuple('Row', ['idn', 'first', 'last', 'birth']) 

def make_person(idn, first, last, birth): 
    return Person(idn, first, last, 
        datetime.strptime(birth, "%m/%d/%Y")) 

records = [make_person(*line.split(',')) for line in text.split('\n')] 
1

異種データを同種のデータ型で保存するのではなく、辞書を使用するかクラスを作成することをおすすめします。辞書で

:クラスで

results = {} 
with open('in.txt') as f: 
    for line in f: 
     id, first, last, day = line.split(',') 
     month, day, year = map(int, day.split('/')) 
     results[id] = {'id':id, 'first':first, 'last':last, 
         'month':month, 'day':day, 'year':year} 

:それぞれの場合に、私はどのように見えるかのキーを使用して、辞書のエントリとして一人一人の情報を格納していますことを

class Person: 
    def __init__(self, id, first, last, day): 
     self.id = id 
     self.first = first 
     self.last = last 
     self.month, self.day, self.year = map(int, day.split('/')) 

results = {} 
with open('in.txt') as f: 
    for line in f: 
     id, first, last, day = line.split(',') 
     results[id] = Person(id, first, last, day) 

注意彼らのID番号。

+0

これは正確に 'namedtuple'が – Elazar

+0

のために作成されたものと信じています。@Elazar - ' namedtuple'は 'tuple'sにオブジェクト表記法を追加しますが、' tuple'は依然として同種のデータ型です( ' 's)。 – TigerhawkT3

+0

私は同意しません。記法は重要な部分です。不変性はもう一つの特徴です。また、フィールドを反復処理できるので、さまざまな形式で印刷するのが簡単になります。 – Elazar

関連する問題