Python: если строка начинается со строки из списка - PullRequest
2 голосов
/ 08 января 2012

Я читаю файл, и в каждой строке есть тег, затем двоеточие, а затем информация, которую я хочу. Пример файла будет выглядеть как

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

и т. Д. (Если вам интересно, это подходящий индекс пакетов)
поэтому я хочу пройтись по каждой строке и посмотреть, начинается ли эта строка с элемента из списка. Я думал что-то вроде

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

Этот код не работает, но, надеюсь, вы понимаете, что я пытаюсь сделать. Как мне это сделать?

Ответы [ 6 ]

1 голос
/ 08 января 2012

Проблема всех решений, основанных на 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 голос
/ 08 января 2012

Попробуйте это:

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

for line in reader.readlines():
    for element in Tags:
        if line.startswith(element):
            PkgInfo[element] = line.split(': ')[1]
            break
1 голос
/ 08 января 2012

Я бы предложил вам просто разделить строку на :, а затем проверить, является ли первая часть одним из ваших ключевых слов. Это легко сделать с помощью 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 голос
/ 08 января 2012

Рабочий раствор с немного другой логикой:

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

И обратите внимание на то, что итерация по элементам была не только одной проблемой. «Пакет» в Tags был определен как «Пакет:», Tags в цикле, на который ссылаются как tags, split.line вместо line.split(), значение не удаляется.

0 голосов
/ 08 января 2012

Я бы попробовал что-то вроде этого:

 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)
0 голосов
/ 08 января 2012

Вам нужно перебрать теги:

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