2016-10-21 3 views
-1

は、私は以下の内容でテキストファイルを持っていると言う:テキストファイルからの簡単なタプルを作成

50 8 2 DDBD_DCAABCDABCD_ABBAC_DDBD_DCAABCDABCD_ABB 

私の目的は、テキストファイルから読み込んで、次の形式でタプルを返す関数を作成することです:

(50, 8, 2, "DDBD_DCAABCDABCD_ABBAC_DDBD_DCAABCDABCD_ABB") 
あなただけ手動で整数変換でタプルを構築することができ
+1

'(50,8,2、...)'は意味がありませんそれらの数字は来ましたか? m? –

+1

あなたが何をする必要があるのか​​教えてくれてありがとう、何を試してみましたか? – MooingRawr

+0

申し訳ありません私の悪い、編集を参照してください – Brian

答えて

1

def foo(filename): 
    with open(filename) as file: 
     t = file.read().split() 
    return (int(t[0]), int(t[1]), int(t[2]), t[3]) 

場合や、あなたは空想になりたい:

return tuple(list(map(int, t[:3])) + [t[3]]) 

listコールは、Python 2に

または除外することができます。

return tuple(f(x) for x, f in zip(t, (int, int, int, str))) 
0

文字列のタプルに文字列を分割するsplit関数を使用します。 int関数は、それを解析できない場合は、ValueErrorを生成して解析します。 try/exceptブロックはエラーをキャッチし、代わりに元の文字列を渡します。

def tuple_parser(text): 
    raw_parts = text.split() 
    parsed_parts = [] 
    for raw_part in raw_parts: 
     try: 
      parsed_part = int(raw_part) 
     except ValueError: 
      parsed_part = raw_part 
     parsed_parts.append(parsed_part) 
    return tuple(parsed_parts) 


def tuple_file_parser(filename) 
    with open(filename, 'r') as f: 
     text = f.read() 
     return tuple_parser(text) 

ファイル内にこのような行が複数ある場合は、tuple_parserをループで呼び出すことができます。 fileオブジェクトを反復処理すると、一度にライン1を返します。

with open(filename, 'r') as f: 
    tuples = [tuple_parser(line) for for line in f] 
+0

コードの長さとは別に、この実装で何が問題になっていますか? –

+0

@ Jean-FrançoisFabre知っていれば地獄。セクシーなワンライナーではないなら、それはSOに属していないようです。 –

+0

多分質問が悪いと考えられるので、答えは必ず_セクシーでなければなりません。 –

0

あなただけtuple

the_tuple = tuple(int(x) if x.isdigit() else x for x in z.split()) 

に渡さgenecompで1行に包括的に(int型や文字列のサポートを)それを行うことができます正の整数で動作しますが、ネガをしたい場合は1ライナーが醜いです:

​​
+1

タプルではなく、タプルにキャストします。 – MooingRawr

+0

が編集されました。ありがとう。 –

関連する問題