2009-01-06 54 views
2

是否有一种pythonic阅读方式 - 说 - 混合整数和字符输入,而无需一次读取整个输入,而不必担心换行符?例如,我有一个空白分隔的数据文件,我只知道有x个整数,然后是y个字符,然后是多个整数。我不想承担任何有关换行的信息。Python:C++ - 像流输入

我的意思是无意识的在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,只要输入一行,函数应该能够返回它们。 :)

回答

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] 
+0

哇,使用map(int,aList)是我不会想到的。尼斯:-) – Abgan 2009-01-06 19:44:38

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 

应该在文件中每次读取一个字符时生成每个用空格分隔的标记。从那里你应该能够将它们转换为他们应该的类型。空白可能也可能更好地照顾。

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())) 
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) ]