Python Скрипт для startwith и endwith - PullRequest
0 голосов
/ 13 июля 2020

Итак, я создал этот сценарий:

names = open("names.txt","r")
for loop in names:
  if loop.endswith('s'):
    print(loop)
for loop in names:
  if loop.startswth('A'):
    print(loop)

Был файл с именем names.txt, в котором было 10 имен. Эта программа должна печатать все имена, начинающиеся с A, и имена, заканчивающиеся на s, но это не работает. Вы можете мне помочь?

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

У вас есть пара проблем:

  1. У вас есть два цикла, но файл исчерпан первым l oop, поэтому второй l oop никогда не запускается (он находит names пустым и обходит тело l oop)
  2. Вы тестируете endswith('s'), но почти каждая строка на самом деле заканчивалась новой строкой, которую вы не удалили

В качестве минимального исправления для обеих проблем (поддержание поведения двух циклов, поэтому вы печатаете строки в конце с помощью s отдельно и первой):

with open("names.txt") as names:
    for loop in names:
        loop = loop.rstrip('\n')  # Remove trailing newline, if any, to avoid doubled
                                  # newline on print and make test work
        if loop.endswith('s'):
            print(loop)
    names.seek(0)  # Reset file pointer to beginning of file
    for loop in names:
        loop = loop.rstrip('\n')  # Same strip as in prior loop
        if loop.startswith('A'):
            print(loop)

Если есть проходящая строка печать за один проход - это нормально, и вам не нужно печатать дважды строки, начинающиеся с A и заканчивающиеся s, вы можете упростить до:

with open("names.txt") as names:
    for loop in names:
        loop = loop.rstrip('\n')  # Remove trailing newline, if any, to avoid doubled
                                  # newline on print and make test work
        if loop.startswith('A') or loop.endswith('s'):
            print(loop)
1 голос
/ 13 июля 2020

Это то, что вы ищете?

def clean(names):
   return [name.strip().lower() for name in names] 

with open("names.txt", "r") as names:
   for name in clean(names):
      if name.startswith('a') and name.endswith('s'):
         print(name)

Имейте в виду, что startswith и endswith чувствительны к регистру. Добавление lower() в это решение делает его нечувствительным к регистру. Вы можете удалить это из метода clean(), если хотите.

Кроме того, как любезно указал @ShadowRanger, вам нужно удалить строку, оканчивающуюся на rstrip (правая полоса). В этом решении используется strip(), который также очищает любые пробелы в начале строки имени, например, если есть табуляции или пробелы, они будут удалены.

...