2013-08-20 4 views
2

Я новичок в программировании и играю с помощью скриптов Python.Как закончить цикл в Python?

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

файл test.txt выглядит примерно так:

ape bear cat dog ape elephant frog giraffe ape horse iguana jaguar 

Я хочу конечный результат на экране выглядеть следующим образом:

ape bear cat dog 
ape elephant frog giraffe 
ape horse iguana jaguar 

Мой код до сих пор:

file = "test.txt" 
read_file = open(file, "r") 
with read_file as data: 
    read_file.read() 
    print(data) 
    word = "ape" 
    for word in data: 
     data.split() 
     print(data) 

Я сделал файл переменной, потому что намерен использовать его много раз в скрипте.

Когда я проверил код, цикл for не останавливался после одного цикла. В конце концов это закончилось, но я уверен, что если бы код или программа автоматически заканчивались бесконечными циклами.

Как отредактировать код, чтобы цикл for остановился, как только он достигнет конца файла? И есть ли более правильный способ написать этот код?

Опять же, это всего лишь пример файла, а не мой фактический файл. Спасибо!

+0

Я вижу много ошибок в вашем примере: 1. ' read_file.read() 'читает и возвращает весь контент файла, но вы ничего не делаете с ним. 2. Вы назначили 'word =" ape "', но я не вижу в этом возможности. Вы не используете это значение, и оно будет заменено на 'for' в следующей строке, если есть какие-либо данные. 3. 'data.split()' возвращает список слов, разделенных пробелами (не работает на месте), но вы ничего не делаете с ним. – KurzedMetal

ответ

1
fileName = "test.txt" 
read_file = open(fileName, "r") 
with read_file as open_file: 
    data = open_file.read().rstrip() 
    keyword = "ape" 
    data = ' '.join(["\n"*(word == keyword) + word for word in data.split()]).strip() 
# data = data.replace(keyword, "\n"+keyword).strip() 
    print(data) 

ВЫВОД:

# ape bear cat dog 
# ape elephant frog giraffe 
# ape horse iguana jaguar 
+1

Нужно быть осторожным, если появляется, например, «виноград» ... –

+0

@JonClements Хорошая точка - изменилась реализация, чтобы учесть это (сохранилась старая реализация как комментарий). – Brionius

0
import re 

file = "test.txt" 
for line in open(file, 'r'): 
    if(re.search('ape', line)): 
     print(line) 
3
>>> f = open("test.txt") 
>>> a = f.read() 
>>> f.close() 
>>> a = a.replace("ape", "\nape") 
>>> print(a) 

ape bear cat dog 
ape elephant frog giraffe 
ape horse iguana jaguar 
+0

Это хорошо работает, кроме как в конце каждой строки я получаю «\». Есть ли способ избежать этого? Благодаря! – hjames

1

Попробуйте это, он делает именно то, что вы собираетесь:

file = "test.txt" 
word = 'ape' 
read_file = open(file, "r") 
with read_file as data: 
    for line in data: 
     sp = line.split(word) 
     for s in sp: 
      if s: 
       print(word + s) 
1

Предполагая, что вы пытаетесь узнать о контроль потока и не пытаюсь ничего фантазия с регулярными выражениями или заменяющего содержанием ...

Похоже, что вы пытаетесь сделать что-то вроде этого (комментариев инлайн):

filename = 'test.txt'    # `file` is a Python built-in 
with open(filename, 'r') as data: # Open the file and close it when we're done 
    for line in data:    # This will read one line at a time and exit the loop at EOF 
     for word in line.strip().split(): # Strip off the newline and split the line into words 
      if word == 'ape':  # If we've found our keyword 
       print    #  Then Print a newline 
      print word,    # Print every word, without a trailing newline 

Для Python 3, вы «должен будет когда-либо так слегка изменить синтаксис:

filename = 'test.txt' 
with open(filename, 'r') as data: 
    for line in data: 
     for word in line.strip().split(): 
      if word == 'ape': 
       print() 
      print(word, end=' ') 
+0

Очень приятно, но можете ли вы включить версию python 3? Похоже, что OP использует python 3. – flornquake

+0

@flornquake: Я живу, чтобы дать! – Johnsyweb

1

файл test.txt выглядит примерно так:

ape bear cat dog ape elephant frog giraffe ape horse iguana jaguar 

Я хочу, чтобы конечный результат на экране выглядеть следующим образом:

ape bear cat dog 
ape elephant frog giraffe 
ape horse iguana jaguar 

Итак, вы хотите каждое вхождение «обезьяна», чтобы быть в начале строки.

Мой код до сих пор:

file = "test.txt" 
read_file = open(file, "r") 
with read_file as data: 

Там нет смысла в расщеплении этих двух вверх. Если with делается с файлом, он закрыт и должен быть снова open().

Так просто сделать

with open(file, "r") as data: 

Кстати, в вашем коде, read_file и data одинаковы.

read_file.read() 

Так вы прочитали весь файл в память и отбрасывать результат.

print(data) 

печати объект файла.

word = "ape" 

Правопреемникам ...

for word in data: 

... и тут же выбрасывает его снова.

 data.split() 

расщепляет данные и сбрасывает результат.

 print(data) 

снова печатает объект файла.

Но, поскольку вы прочитали весь файл, цикл for, вероятно, вообще не запускался.

Улучшения:

filename = "test.txt" # file is a builtin function 
hotword = "ape" 
with open(filename, "r") as read_file: 
    for line in read_file: 
     parts = line.split(hotword) 
     if not parts[0]: # starts with the hotword, so 1st part is empty 
      del parts[0] 
     print ("\n" + ape).join(parts) 

Я сделал файл переменной, потому что я намерен использовать его много различных раз в сценарии.

Для названия это нормально, но открытый файл не может быть переработан, так как with закрывает его.

Когда я проверил код, цикл цикла не останавливался после одного цикла.

Уверенный? Что он напечатал?

+0

Распечатал файл text.txt, а затем правильный конечный результат - но он повторял этот цикл много раз – hjames

0

Вы можете использовать re.sub, чтобы избежать слова, найденного не в начале строки, и поставить перед ним символ новой строки, чтобы вы могли использовать следующий код.

Обратите внимание, что это выглядит для целых слов- - например, grape не будет согласован с ape (в отличии от str.replace решения, предложенного):

import re 

word = 'ape' 
with open('yourfile') as fin: 
    line = next(fin, '') 
    print(re.sub(r'[^\b]({0}\s+)'.format(re.escape(word)), r'\n\1', line))