2016-07-25 12 views
0

私はPythonを初めて使い、入出力を学んでいます。今、私はコマンドライン入力から指定したファイルからオブジェクトに属性を追加しようとしています。例えばコマンドライン入力からPythonオブジェクトを初期化する

、私は次のことを実行したい:$ /...filepath.../ python3 myCode.py < 06ファイル06myCode.py

$ /...filepath.../ cat 06 
7 
4 5 2 7 88 2 1 

の内容を渡します。 myCode.py06の両方が同じディレクトリにあります。

私は次のように属性を持つコマンドライン呼び出しからMyClassオブジェクトを作成しようとしています:

## myCode.py ## 

# create class 
class MyClass(object): 
    def __init__(self): 
    self._num_one = int(sys.stdin.readline())  
    self._num_many = [int(x) for x in sys.stdin.readline().split()] 

# print attributes 
print(MyClass()._num_many) 
print(MyClass()._num_one) 

が、私はself._num_oneために、次のエラー​​を取得しますができTOR印刷self._num_manyだとしています理由は分かりません。 self._num_oneself.num_manyの順番を交換すると、self._num_oneを得ることができます。 06は2行しかないので、私が最初に読んでいない最初の行はありますか?なぜ2つの属性のどちらか一方しか印刷できないのですが、両方を印刷するにはどうしたらよいですか?

多くのありがとうございます。

+1

一般に、クラスイニシャライザでIOなどの複雑な操作を行うことは悪い考えです。この場合、新しいオブジェクトを作成するたびにstdinから読み込みます。それはそれをはるかに困難にします。 "ファクトリ関数"を使ってstdinを読み込み、入力を解析し、適切な型のクラスをインスタンス化する方が良いでしょう。 – Keith

答えて

0

作業からそれを停止し、あなたのコードに問題があります。

まず最初に、入力ファイルを1行ずつ読み込んでいる場合は、前と後の空白を削除する必要があります。これは.readline()の後に.strip()メソッドへの呼び出しを意味します。 int()は数値以外の文字列を処理できないため、ValueErrorが表示されています。

>>> int('x') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'x' 
>>> int(' ') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: ' ' 
>>> int('\n') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '\n' 
>>> int('1') 
1 

ように、コードを使用すると、MyClass()を行うたびに、新しいオブジェクトをインスタンス化し、

第二
class MyClass(object): 
    def __init__(self): 
     self._num_one = int(sys.stdin.readline().strip()) 
     self._num_many = [int(x) for x in sys.stdin.readline().strip().split()] 

になります。コードを正しく理解すれば、を2回、(計4行)を2回読み込む予定です。入力ファイルが与えられたら、ONEオブジェクトのインスタンス化に興味があると仮定しています。したがって、変数をインスタンス化して変数にタグ付けし、後でその参照を使用します。

instantiatedObject = MyClass() 
print(instantiatedObject._num_many) 
print(instantiatedObject._num_one) 
0

あなたの入力ストリームがintではなく、スペースと "\ n"区切り文字を含む文字列であるため、まずこれらの処理を行う必要があります。

迅速かつ簡単な方法は、この(テストしていない)のようなものにあなたのコードを変更します

self._num_one = int("".join(sys.stdin.readline().split())) 
関連する問題