2013-05-29 1 views
0

Я понимаю, что это, наверное, очень легко, я хочу эквивалент этого кода С в Python:Python I/O и строка, соответствующая

#include <stdio.h> 
#include <string.h> 
#define BUFFER 200 
int main() 
{ 
    char buffer[BUFFER]; 
    while (fgets(buffer, BUFFER, stdin)) 
    { 
     if (strstr(buffer, "BEER")) 
      printf("Drink up!\n"); 
    } 
    return 0; 
} 

я искал в Интернете, но я думаю, что мой мозг жарится.

+0

как эквивалент сделать вас хочу это? – cmd

+0

Я предполагаю, что функционально эквивалентны, не нужны массивы символов или пределы буфера. –

+0

Дело в том, что это не очень питоническая вещь; обычно вы просто делаете что-то вроде 'for line in fileinput.fileinput():' и делаете вещи с каждой строкой. – abarnert

ответ

1

Equivalent способ сделать это, хотя и не точно такой же

for line in iter(raw_input, ''): 
    if 'BEER' in line: 
     print('Drink up!') 


foo 
bar 
aBEERc 
Drink up! 
***blank line*** 

+0

Изменено это на принятый ответ - работает лучше в конкретной среде. –

2

Pythonic вещь, чтобы сделать, это немного по-другому:

import fileinput 
for line in fileinput.input(): 
    if "BEER" in line: 
     print("Drink up!") 

Но это делает много вещей, которые ваш код C не делает, например, позволяя пользователю передавать аргументы имени файла, которые следует читать вместо stdin as ar guments и т.д.


Это более прямое отображение кода:

try: 
    while True: 
     buffer = input() # or raw_input, for 2.x 
     if "BEER" in buffer: 
      print("Drink up!") 
except EOFError: 
    pass 

Однако он отсутствует часть, где линия более 300 символов линии, которая включает в себя "BEER" в первые 200 символы, а затем снова в следующем будет печатать дважды, или 300-символьная строка, которая имеет «ПИВО», начиная с позиции 198, вообще не печатает.


Если это проблема, вы, вероятно, хотите что-то вроде этого:

import sys 

while True: 
    buffer = sys.stdin.readlines(200) 
    if not buffer: 
     break 
    for line in buffer: 
     for i in range(0, len(buffer), 200): 
      if "BEER" in buffer[i*200:i*200+200]: 
       print("Drink up!") 
+0

@cmd: я отредактировал ответ, чтобы исправить это, но затем ... 'input()' вызывает EOFError, поэтому он заканчивается на EOF. – abarnert

+0

Спасибо, я поеду с самым питоническим методом. Я также вижу другие ответы, Python слишком TIMTOWTDI для меня! –

+0

@YiminRong: Помните, это не «есть только один способ сделать это», но «есть только один способ для этого». Если вы хотите сделать вашу жизнь труднее, вы всегда можете. Кроме того, вы должны знать, что это такое, прежде чем вы сможете найти один способ сделать это. И если «это» «именно то, что делает этот код C», вы часто задаете неправильный вопрос. – abarnert

Смежные вопросы