Python startswith 和 endswith 的脚本

Python Script for startswith and endswith

所以我制作了这个脚本:

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

这是您要找的吗?

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)

请记住 startswithendswith 区分大小写。在此解决方案中添加 lower() 使其不区分大小写。如果需要,您可以从 clean() 方法中删除它。

此外,正如@ShadowRanger 所指出的那样,您需要去除以 rstrip 结尾的行(右侧去除)。此解决方案使用 strip(),它还会清除名称字符串开头的所有空格,例如如果有制表符或空格,它们将被删除。

你有几个问题:

  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)