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 回答
3

如果你不想一次读一整行,你可能想尝试这样的事情:

def read_tokens(file):
    while True:
        token = []
        while True:
            c = file.read(1)
            if c not in ['', ' ', '\t', '\n']:
                token.append(c)
            elif c in [' ', '\t', '\n']:
                yield ''.join(token)
                break
            elif c == '':
                yield ''.join(token)
                raise StopIteration

这应该在文件中生成每个以空格分隔的标记,一次读取一个字符。从那里你应该能够将它们转换为它们应该是的任何类型。空格也可以得到更好的处理。

于 2009-01-06T19:24:52.850 回答
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 回答