是否有一种pythonic的阅读方式 - 比如说 - 混合整数和字符输入而不会立即读取整个输入并且不用担心换行?例如,我有一个文件,其中包含空格分隔的数据,我只知道有x个整数,然后是y个字符,然后是更多的整数。我不想假设有关换行的任何内容。
我的意思是像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并且该函数应该能够将它们返回为一条线就输入了。 :)
答案 0 :(得分:6)
返回标记流并且行为类似于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()))
答案 1 :(得分: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
应该在文件中生成每个空格分隔的标记,一次读取一个字符。从那里你应该能够将它们转换成它们应该的任何类型。这个空白也可能会得到更好的照顾。
答案 2 :(得分: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]
答案 3 :(得分: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) ]