У меня есть текстовый файл (file1.txt) с 1 строкой на строку по многим строкам. Я пытаюсь прочитать файл и записать определенные строки в новый файл. (File2.txt)

Мой текстовый файл выглядит примерно так.

foo1
foo2
foo3
foo4
foo5
foo6

Так далее..

Например, я хочу написать foo1, foo2, foo4, foo6 в мой новый файл и пропустить foo3 и foo5.

foo1
foo2
foo4
foo6

Я хочу сохранить оригинальный файл.

Мой код выглядит так ...

with open("file1.txt","r") as r:
    lines=r.read()
    lines =lines.replace("foo3","")
    lines = lines.replace("foo5","")

r.close()
with open("file2.txt","a") as w:
    w.write(lines)
w.close

Проблема в том, что я получаю этот вывод ..

foo1
foo2

foo4

foo6

Я думаю, это потому, что я заменяю foo на "", как мне избавиться от пробела?

ТИА,

Павел.

0
Paul Tricklebank 1 Фев 2013 в 16:04

2 ответа

Лучший ответ

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

lines =lines.replace("foo3\n","")
lines = lines.replace("foo5\n","")
2
Michael J. Barber 1 Фев 2013 в 12:08

Предполагая, что исключения являются переменными:

def rwfile(infile, outfile, exceptions=[]):

    o = open(outfile, "w")

    for line in open(infile):
        if line.rstrip() not in exceptions:
            o.write(line)

    o.close()


rwfile("in", "out", ['foo3', 'foo5'])

В:

foo1
foo2
foo3
foo4
foo5
foo6
foo7
foo8
foo9

Вне:

foo1
foo2
foo4
foo6
foo7
foo8
foo9

В продолжение комментариев ОП - вот версия, использующая функцию предиката, чтобы решить, какие строки следует включить.

def rwfilep(infile, outfile, predicate=lambda x: True):

    o = open(outfile, "w")

    for line in open(infile):
        if predicate(line):
            o.write(line)

    o.close()

def ignore_some(line):
    """return True to include"""
    return line.rstrip() not in ['foo3', 'foo5']

def ignore_comments(line):
    """return True to include"""
    return not line.startswith("#")

rwfilep("in", "out2", ignore_some)

rwfilep("in", "out3", ignore_comments)
2
sotapme 1 Фев 2013 в 14:25