Python list.remove () кажется неисправным - PullRequest
0 голосов
/ 08 декабря 2010
fileHandle = open(filedir, 'r')
content = fileHandle.read().split('\n')
for e in content:
    if (e == '' or (e[0] != r"@"):
        content.remove(e)
fileHandle.close()

Итак, что я пытаюсь сделать, это открыть файл с текстом и разбить его на строки, а затем удалить те строки, которые не начинаются с @. Но вместо этого, в какой-то момент он просто не снимает больше строк, а некоторые без конца '@' в содержимом var. Почему?

Ответы [ 4 ]

3 голосов
/ 08 декабря 2010

Никогда не удаляйте элементы списка, перебирая его.

Почему бы просто не сделать следующее:

with open(filedir) as f:
    lines = [line.rstrip("\r\n") for line in f if line.startswith("@")]
2 голосов
/ 08 декабря 2010

Не изменяйте контейнер, пока вы перебираете его.

Вы слишком усложняете это во многих отношениях: вам не нужно явно закрывать файл (используйте with -блок); вам не нужно использовать «необработанную строку» для указания '@'; вам не нужно изобретать «начинается с»; вам не нужно разбивать файл на строки самостоятельно (просто перебирая файл, вы получите данные по одной строке за раз), и вам не нужно писать свой собственный цикл.

То, что вы хотите, это список строк в файле, которые начинаются с '@'. Итак, спросите об этом напрямую:

with open(filedir, 'r') as fileHandle:
  content = [line for line in fileHandle if line.startswith('@')]
1 голос
/ 08 декабря 2010

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

with open(filedir, 'r') as fileHandle:
  with open(outputfile, 'w') as outputHandle:
    for line in fileHandle:
      if not line or line.startswith('@'):
        continue
    outputHandle.write(line)
0 голосов
/ 08 декабря 2010

Вы не должны изменять то, что вы повторяете. Я внес некоторые изменения в ваш код и разместил его здесь с комментариями.

fileHandle = open(filedir, 'r')
content = (x.strip() for x in fileHandle.readlines()) # Get all the lines and use a genexp to strip out the spaces. 
for e in content[:]: # Python idiom for "copy of a list"
    if (e == '' or (e[0] != r"@"):
        content.remove(e)
fileHandle.close()

Это просто для иллюстрации оператора [:]. Я все еще рекомендую решение Игнасио по этому поводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...