Разбиение файла на строки в Python с помощью re.split - PullRequest
1 голос
/ 04 мая 2009

Я пытаюсь разбить файл со списком, используя код, подобный следующему:

lines = [x for x in re.split(r"\n+", file.read()) if not re.match(r"com", x)]

Однако в списке строк всегда есть пустая строка в качестве последнего элемента. Кто-нибудь знает способ избежать этого (исключая необходимость ставить pop () впоследствии)?

Ответы [ 4 ]

9 голосов
/ 04 мая 2009

Убери молоток регулярного выражения: -)

  1. Вы можете перебирать файл напрямую; readlines() почти устарел в наши дни.
  2. Читайте о str.strip() (и его друзьях lstrip() и rstrip()).
  3. Не используйте file в качестве имени переменной. Это плохо, потому что file - это встроенная функция .

Вы можете написать свой код как:

lines = []
f = open(filename)
for line in f:
    if not line.startswith('com'):
        lines.append(line.strip())

Если вы все еще получаете пустые строки, вы можете добавить в тест:

lines = []
f = open(filename)
for line in f:
    if line.strip() and not line.startswith('com'):
        lines.append(line.strip())

Если вы действительно хотите это в одну строку:

lines = [line.strip() for line in open(filename) if line.strip() and not line.startswith('com')]

Наконец, если вы работаете на python 2.6, посмотрите на с оператором , чтобы немного улучшить ситуацию.

3 голосов
/ 04 мая 2009

lines = file.readlines ()

редактирование: или если вам не нужны пустые строки, вы можете сделать

lines = filter (лямбда-а: (a! = '\ N'), file.readlines ())

редактировать ^ 2 чтобы удалить завершающий символ новой строки, вы можете сделать

lines = [re.sub ('\ n', '', line) для строки в фильтре (лямбда a: (a! = '\ N'), file.readlines ())]

1 голос
/ 04 мая 2009

Еще один удобный трюк, особенно если вам нужен номер строки, заключается в использовании перечисления:

<code>
fp = open("myfile.txt", "r")
for n, line in enumerate(fp.readlines()):
    dosomethingwith(n, line)

Я только недавно узнал о перечислении, но с тех пор это пригодилось довольно много раз.

0 голосов
/ 04 мая 2009

Это должно сработать, а также исключить регулярные выражения:

all_lines = (line.rstrip()
             for line in open(filename)
             if "com" not in line)
# filter out the empty lines
lines = filter(lambda x : x, all_lines)

Поскольку вы используете понимание списка, а не выражение генератора (поэтому весь файл загружается в память в любом случае), вот ярлык, позволяющий избежать кода для фильтрации пустых строк:

lines = [line
     for line in open(filename).read().splitlines()
     if "com" not in line]
...