2

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

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]

这段代码不起作用,但希望你能理解我想要做什么。我将如何实现这一目标?

4

6 回答 6

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' inTags被定义为 'Package: ',Tags在循环中引用为tagssplit.line相反line.split(),值不会被剥离。

于 2012-01-08T16:29:47.157 回答
1

我建议你只是分割线:然后测试第一部分是否是你的关键字之一。这可以通过使用setin运算符轻松完成:

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()

但请注意,如果每一行中没有一个冒号,这将失败。

于 2012-01-08T16:32:40.497 回答
1

尝试这个:

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

for line in reader.readlines():
    for element in Tags:
        if line.startswith(element):
            PkgInfo[element] = line.split(': ')[1]
            break
于 2012-01-08T16:35:44.383 回答
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:] 
于 2012-01-08T16:36:31.607 回答
0

您需要遍历标签:

PkgInfo={}
Tags=['Package: ', 'Section', 'Name']
for line in reader.readlines():
    for tag in Tags:
        if line.startswith(tag):
            PkgInfo[tag]=line.split(': ')[1]
            break
于 2012-01-08T16:17:36.760 回答
0

我会尝试这样的事情:

 PkgInfo={}
 #I assume it should be 'Package' not 'Package: '
 Tags=['Package', 'Section', 'Name']

 for line in reader.readlines()
    k, v = line.split(': ')
    if k in Tags:
        PkgInfo[k] = v

甚至更快更脏的两个班轮:

 #I assume it should be 'Package' not 'Package: '
 Tags=['Package', 'Section', 'Name']

 PkgInfo = dict(line.split(': ') for line in reader.readlines() if line.split(': ')[0] in Tags)
于 2012-01-08T16:23:40.317 回答