Фильтрация файла по двум условиям

Shikar

Новичок
Пользователь
Дек 14, 2021
14
0
1
Добрый всем день.
Нужна помощь в обработке текстовых файлов. Проблема заключается в следующем:
необходимо удалять строки, в файле, в которых есть два совпадения, например:
a101010 и a101010; a101010 и a101210; a101210 и a101010; a101210 и a101210

Примерный текст файла:

a101010 xxxxx a101010 xxxxx - удалить
a101110 xxxxx a101010 xxxxx - не удалять
a101010 xxxxx a101110 xxxxx - не удалять
a101010 xxxxx a101210 xxxxx - удалить
a101210 xxxxx a101010 xxxxx - удалить
a101110 xxxxx a101110 xxxxx - не удалять
a101210 xxxxx a101210 xxxxx - удалить
a101310 xxxxx a101010 xxxxx - не удалять
a101010 xxxxx a101310 xxxxx - не удалять
a101410 xxxxx a101010 xxxxx - не удалять
a101010 xxxxx a101510 xxxxx - не удалять
a101110 xxxxx a101510 xxxxx - не удалять

Используя скрипт, удаляются все строки где встречается "a101010", что не нужно!! Можно ли его усовершенствовать?
Python:
with open("orig.txt", "r") as f:
    data = f.readlines()
data = filter(lambda line: "a101010" not in line, data)
with open("filter.txt", "w") as f:
    f.write("".join(data))

Вот еще вопрос, можно ли заместо "a101010" вставить файл в котором записаны слова для фильтрации?
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Python:
with open("orig.txt", "r") as f:
    data = f.readlines()
data = filter(lambda line: "a101010" not in line and "a11001100" not in line, data)
with open("filter.txt", "w") as f:
    f.write("".join(data))

А дальше уже менять под себя, например так:
Python:
with open("orig.txt", "r") as f:
    data = f.readlines()
dels = [['a101010', 'a101010'], ['a101010', 'a101210'], ['a101210', 'a101210']]

def del_or_not(d):
    for i in dels:
        if all([k in d for k in i]):
            return False
    return True

data = filter(del_or_not, data)
with open("filter.txt", "w") as f:
    f.write("".join(data))

dels - список пар (можно не пару, а больше или меньше элементов) при наличии которых в строке, строка будет удалена
 
  • Мне нравится
Реакции: Shikar

Shikar

Новичок
Пользователь
Дек 14, 2021
14
0
1
Python:
with open("orig.txt", "r") as f:
    data = f.readlines()
data = filter(lambda line: "a101010" not in line and "a11001100" not in line, data)
with open("filter.txt", "w") as f:
    f.write("".join(data))

А дальше уже менять под себя, например так:
Python:
with open("orig.txt", "r") as f:
    data = f.readlines()
dels = [['a101010', 'a101010'], ['a101010', 'a101210'], ['a101210', 'a101210']]

def del_or_not(d):
    for i in dels:
        if all([k in d for k in i]):
            return False
    return True

data = filter(del_or_not, data)
with open("filter.txt", "w") as f:
    f.write("".join(data))

dels - список пар (можно не пару, а больше или меньше элементов) при наличии которых в строке, строка будет удалена
все равно удаляет строки, которые удалять не нужно, например: a101010 xxxxx a101510 xxxxx.
что значат переменные "[k in d for k in i]"?
 

Shikar

Новичок
Пользователь
Дек 14, 2021
14
0
1
все равно удаляет строки, которые удалять не нужно, например: a101010 xxxxx a101510 xxxxx.
что значат переменные "[k in d for k in i]"?
т.е. удаляет все строки где находит a101010 и a101210
 

Shikar

Новичок
Пользователь
Дек 14, 2021
14
0
1
Пошел от обратного, решил сохранить строки которые не нужно удалять

Код:
with open("orig.txt", "r") as f:
    data = f.readlines()
dels = [['a101510'], ['a101310'], ['a101410'], ['a101110']]

def del_or_not(d):
    for i in dels:
        if all([k in d for k in i]):
            return True
    return False

data = filter(del_or_not, data)
with open("filter.txt", "w") as f:
    f.write("".join(data))

на выходе получается все как надо.
 

Shikar

Новичок
Пользователь
Дек 14, 2021
14
0
1
Еще вопрос, как задать имя редактируемого файла orig.txt не в самом скрипте, а при его открытии типа того:
запускаем скрипт и он спрашивает "введите имя файла", вводим имя и он его открывает и фильтрует
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Еще вопрос, как задать имя редактируемого файла orig.txt не в самом скрипте, а при его открытии типа того:
запускаем скрипт и он спрашивает "введите имя файла", вводим имя и он его открывает и фильтрует
Можно так:
Python:
filename = input("Введите имя файла: ")

with open(filename, "r") as f:
    data = f.readlines()
dels = [['a101510'], ['a101310'], ['a101410'], ['a101110']]

def del_or_not(d):
    for i in dels:
        if all([k in d for k in i]):
            return True
    return False

data = filter(del_or_not, data)
with open("filter.txt", "w") as f:
    f.write("".join(data))
 
  • Мне нравится
Реакции: Shikar

Shikar

Новичок
Пользователь
Дек 14, 2021
14
0
1
Всем спасибо за помощь!!!
 

Форум IT Специалистов