Python: 如果字符串以列表中的某个字符串开头
我正在读取一个文件,每一行都有一个标签,后面跟着一个冒号,然后是我想要的信息。一个示例文件看起来像这样:
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()
,值也没有去掉多余的空格。