0

所以我做了这个脚本:

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 结尾的名称,但它不起作用。你能帮助我吗?

4

2 回答 2

2

你有几个问题:

  1. 你有两个循环,但是文件被第一个循环用尽了,所以第二个循环永远不会运行(它发现names空并绕过循环体)
  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)
于 2020-07-12T23:40:41.700 回答
1

这是你要找的吗?

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(),它还清除名称字符串开头的所有空格,例如,如果有制表符或空格,它们将被删除。

于 2020-07-12T23:17:46.170 回答