2

入力全体を一度に読み取らず、改行を気にせずに、整数と文字の混合入力を読み取るpythonicな方法はありますか? たとえば、空白で区切られたデータを含むファイルがありますが、x 整数、次に y 文字、さらに z 整数があることしか知りません。改行については何も想定したくありません。

私は、C++ で次のように無知なことを意味します。

...

int i, buf;
char cbuf;
vector<int> X, Z;
vector<int> Y;

for (i = 0; i < x; i++) {
    cin >> buf;
    X.push_back(buf);
}

for (i = 0; i < y; i++) {
    cin >> cbuf;
    Y.push_back(cbuf);
}

for (i = 0; i < z; i++) {
    cin >> buf;
    Z.push_back(buf);
}

編集:コンソールからのライブ入力でもうまく動作するようにしたいと言うのを忘れていました-つまり、トークンを取得する前にctrl + dを押す必要はなく、関数はトークンを取得するとすぐにそれらを返すことができるはずです行が入力されました。:)

4

4 に答える 4

7

cinトークンのストリームを返し、次のように動作する小さなジェネレーター関数はどうですか?

def read_tokens(f):
   for line in f:
       for token in line.split():
           yield token

x = y = z = 5  # for simplicity: 5 ints, 5 char tokens, 5 ints
f = open('data.txt', 'r')
tokens = read_tokens(f)
X = []
for i in xrange(x):
    X.append(int(tokens.next()))
Y = []
for i in xrange(y):
    Y.append(tokens.next())
Z = []
for i in xrange(z):
    Z.append(int(tokens.next()))
于 2009-01-06T20:02:33.727 に答える
2

このような?

>>> data = "1 2 3 4 5 6 abcdefg 9 8 7 6 5 4 3"

たとえば、次のように取得できます。data= someFile.read()

>>> fields= data.split()
>>> x= map(int,fields[:6])
>>> y= fields[6]
>>> z= map(int,fields[7:])

結果

>>> x
[1, 2, 3, 4, 5, 6]
>>> y
'abcdefg'
>>> z
[9, 8, 7, 6, 5, 4, 3]
于 2009-01-06T19:13:09.193 に答える
0

どうですか?heikogerlach の優れたread_tokens.

def read_tokens(f):
   for line in f:
       for token in line.split():
           yield token

6 つの数字、7 つの文字、および 6 つの数字をピックアップするには、次のようなことができます。

fi = read_tokens(data)
x= [ int(fi.next()) for i in xrange(6) ]
y= [ fi.next() for i in xrange(7) ]
z= [ int(fi.next()) for i in xrange(6) ]
于 2009-01-06T21:31:22.440 に答える