Найти - Пользователи
Полная версия: Удаление из файла по блек листу
Начало » Python для новичков » Удаление из файла по блек листу
1 2
Mozart
Здравствуйте, есть такая задача:
Есть 1 файл. в нем к примеру 3000 строк
Есть второй файл, в нем 200 строк # это файл блек листа
Нужно что бы скрипт пробегался по этим двум файлам и создавал 3-ий файл в котором будет только строки из 1 файла без строк из второго, тобишь 2800 строк.

Вот что то никак у меня не выходит это сделать, уже все перепробовал, может подскажете как решить проблему? Вот набросок 1 из вариантов кода, вроде все должно работать …

# -*- coding: cp1251 -*-

listik = []

def main():
global listik
"""Функция запуска"""
f1 = open("1.txt", "r")
for i1 in f1.readlines():
listik.append(i1.rstrip("\n"))
for i2 in listik:
if i2 != [x.rstrip("\n") for x in open("2.txt", "r")]:
with open("3.txt", "a") as f2:
f2.write(i2 + "\n")
else: pass
f1.close()

main()

raw_input("Kon4ul ...")

Спасибо за советы …
Soteric
Может как-то так?
fata1ex
Я бы сделал это так:
with open('file', 'r') as fin, open('blacklist', 'r') as fblack_list, \
     open('output', 'w') as fout:
     black_list = set(fblack_list.read().splitlines())
      
     for line in fin:
        if line.strip() not in black_list:
            fout.write(line)

Разность множеств делает предположение об отсутствии дубликатов и теряет порядок исходных данных.
Mozart
Всем спасибо за ответы, но может кто сказать - почему мой вариант не работает? Он просто копирует все строки из файла 1 в файл 3 без учета блек листа, мне интересно где же я ошибку в коде допустил ?
Soteric
Думаю проще добавить вывод промежуточных результатов и посмотреть что с чем сравнивается.
EBFE
Всем спасибо за ответы, но может кто сказать - почему мой вариант не работает?
 if i2 != [x.rstrip("\n") for x in open("2.txt", "r")]

i2 это string.
 [x.rstrip(... ]
это list.


Т.е выглядеть будет примерно так:
"line1" != [ "line2", "line3" ... "line1" ]
естественно будет выдавать “да, line1 это не список xyz ”


odnochlen
Пересчитывать файл в цикле, да и сложность O(len(input) * len(exclude)) не красит.
Mozart
Всем спасибо, в общем сделал вот так вот:

# -*- coding: cp1251 -*-

listik = []

def deleter(x, y):
"""Функция удаления"""
x = x.rstrip("\n")
if x not in y:
with open("3.txt", "a") as f2:
f2.write(x + "\n")

def main():
"""Функция запуска"""
global listik
f1 = open("2.txt", "r")
for i1 in f1:
listik.append(i1.rstrip("\n"))
for i2 in open("1.txt", "r"):
deleter(i2, listik)
f1.close()

main()

raw_input("Kon4ul ...")

Все работает )
py.user.next
fata1ex
black_list = set(fblack_list.read().splitlines())
black_list = set(fblack_list)
odnochlen
Mozart
Всем спасибо, в общем сделал вот так вот:
А зачем для каждой строчки открывать файл?

fata1ex, не будет работать, например, если у файлов разные переносы строки.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB