Python: 如果字符串以列表中的某个字符串开头

2 投票
6 回答
10055 浏览
提问于 2025-04-17 09:48

我正在读取一个文件,每一行都有一个标签,后面跟着一个冒号,然后是我想要的信息。一个示例文件看起来像这样:

Package: com.something.something
Section: Utilities
Name: Something

等等,(如果你在想这是什么,那是一个apt软件包索引)
所以我想要逐行检查,看看这一行是否以列表中的某个元素开头。我在想可以这样做:

PkgInfo={}
Tags=['Package', 'Section', 'Name']
for line in reader.readlines()
    if line.startswith(element in Tags):
        PkgInfo[element]=line.split(': ')[1]

这段代码并不好用,但希望你能明白我想要做的事情。我该怎么做才能实现这个呢?

6 个回答

1

我建议你可以先把每一行按照:这个符号分开,然后检查分开的第一部分是不是你想要的关键词。这个操作可以很简单地通过使用一个set(集合)和in这个操作符来完成:

tags = set(['Package', 'Section', 'Name'])
pkgInfo = {k: v.strip() for k, v in (line.split(':') for line in reader) if k in tags}

或者你也可以用更长的写法:

tags = set(['Package', 'Section', 'Name'])
pkgInfo = {}

for line in reader:
    k, v = line.split(':')
    if k in tags:
        pkgInfo[k] = v.strip()

不过要注意,如果每一行里面没有正好一个冒号,这个方法就会出错。

1

所有基于split()的解决方案都有一个问题,那就是如果冒号出现超过一次,它们可能会出错。虽然这种方法看起来不太优雅,但它更可靠:

PkgInfo = {}
Tags = ['Package','Section','Name']
splitter = ': '
splitLen = len(splitter)
for line in reader.readlines():
  firstColon = line.find(splitter)
  if firstColon > 0: 
    key = line[:firstColon]
    if key in Tags:
      pkgInfo[key] = line[firstColon + splitLen:] 
1

这是一个有效的解决方案,逻辑稍微有点不同:

PkgInfo={}
Tags=['Package', 'Section', 'Name']


for line in reader.readlines():
    entry = line.strip().split(': ', 2)
    if len(entry) != 2:
        continue
    element, value = entry[0], entry[1]
    if element in Tags:
        PkgInfo[element] = value

print PkgInfo

另外要注意,遍历元素不仅仅是一个问题。‘Package’在Tags中被定义为‘Package: ’,而在循环中引用Tags时用的是tags,而且用split.line代替了line.split(),值也没有去掉多余的空格。

撰写回答