Вопрос разбора текстового файла в Python - PullRequest
0 голосов
/ 24 августа 2011

Я новичок в python и пытаюсь удалить строки в текстовом файле, если найду слово «Lett». в соответствии. Вот пример текстового файла, который я пытаюсь проанализировать:

<A>Lamb</A> <W>Let. Moxon</W>
<A>Lamb</A> <W>Danger Confound. Mor. w. Personal Deformity</W>
<A>Lamb</A> <W>Gentle Giantess</W>
<A>Lamb</A> <W>Lett., to Wordsw.</W>
<A>Lamb</A> <W>Lett., to Procter</W>
<A>Lamb</A> <W>Let. to Old Gentleman</W>
<A>Lamb</A> <W>Elia Ser.</W>
<A>Lamb</A> <W>Let. to T. Manning</W>

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

Ответы [ 5 ]

4 голосов
/ 24 августа 2011
f = open("myfile.txt", "r")
for line in f:
  if not "Lett." in line: print line,

f.close()

или если вы хотите записать результат в файл:

f = open("myfile.txt", "r")
lines = f.readlines()
f.close()
f = open("myfile.txt", "w")
for line in lines:
  if not "Lett." in line: f.write(line)

f.close()
1 голос
/ 24 августа 2011

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

У меня есть шаблон, который выглядит следующим образом:

from sed_util import delete_range, insert_range, append_range, replace_range

def sed(filename):
    modified = 0

    # Load file into memory
    with open(filename) as f:
        lines = [line.rstrip() for line in f]

    # magic here...

    if modified:
        with open(filename, "w") as f:
            for line in lines:
                f.write(line + "\n")

А в разделе # magic here у меня есть:

  1. модификаций для отдельныхстроки, например:

    lines[i] = change_line(lines[i])

  2. вызывает мои утилиты sed для вставки, добавления и замены строк, например:

    lines = delete_range(lines, some_range)

Последний использует примитивы, подобные этим:

def delete_range(lines, r):
    """
    >>> a = list(range(10))
    >>> b = delete_range(a, (1, 3))
    >>> b
    [0, 4, 5, 6, 7, 8, 9]
    """
    start, end = r
    assert start <= end
    return [line for i, line in enumerate(lines) if not (start <= i <= end)]

def insert_range(lines, line_no, new_lines):
    """
    >>> a = list(range(10))
    >>> b = list(range(11, 13))
    >>> c = insert_range(a, 3, b)
    >>> c
    [0, 1, 2, 11, 12, 3, 4, 5, 6, 7, 8, 9]
    >>> c = insert_range(a, 0, b)
    >>> c
    [11, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> c = insert_range(a, 9, b)
    >>> c
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 9]
    """
    assert 0 <= line_no < len(lines)
    return lines[0:line_no] + new_lines + lines[line_no:]

def append_range(lines, line_no, new_lines):
    """
    >>> a = list(range(10))
    >>> b = list(range(11, 13))
    >>> c = append_range(a, 3, b)
    >>> c
    [0, 1, 2, 3, 11, 12, 4, 5, 6, 7, 8, 9]
    >>> c = append_range(a, 0, b)
    >>> c
    [0, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> c = append_range(a, 9, b)
    >>> c
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12]
    """
    assert 0 <= line_no < len(lines)
    return lines[0:line_no+1] + new_lines + lines[line_no+1:]

def replace_range(lines, line_nos, new_lines):
    """
    >>> a = list(range(10))
    >>> b = list(range(11, 13))
    >>> c = replace_range(a, (0, 2), b)
    >>> c
    [11, 12, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> c = replace_range(a, (8, 10), b)
    >>> c
    [0, 1, 2, 3, 4, 5, 6, 7, 11, 12]
    >>> c = replace_range(a, (0, 10), b)
    >>> c
    [11, 12]
    >>> c = replace_range(a, (0, 10), [])
    >>> c
    []
    >>> c = replace_range(a, (0, 9), [])
    >>> c
    [9]
    """
    start, end = line_nos
    return lines[:start] + new_lines + lines[end:]

def find_line(lines, regex):
    for i, line in enumerate(lines):
        if regex.match(line):
            return i

if __name__ == '__main__':
    import doctest
    doctest.testmod()

Для ясности тесты работают с массивами целых чисел, но преобразования работают и с массивами строк.

Обычно я сканирую список строк, чтобы определить изменения, которые я хочу применить, обычно с помощью регулярных выражений, а затем применяю изменения к сопоставимым данным.Например, сегодня я закончил с 2000 изменений строк в 150 файлах.

Это работает лучше, чем sed, когда вам нужно применить многострочные шаблоны или дополнительную логику, чтобы определить, применимо ли изменение.

1 голос
/ 24 августа 2011
# Open input text
text = open('in.txt', 'r')
# Open a file to output results
out = open('out.txt', 'w')

# Go through file line by line
for line in text.readlines():
    if 'Lett.' not in line: ### This is the crucial line.
        # add line to file if 'Lett.' is not in the line
        out.write(line)
# Close the file to save changes
out.close()
0 голосов
/ 25 августа 2011
result = ''
for line in open('in.txt').readlines():
    if 'lett' not in line:
        result += line
f = open('out.txt', 'a')
f.write(result)
0 голосов
/ 24 августа 2011

вернуть [l для l в открытом (fname), если 'Lett' не в l]

...