Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 3, 2012 13:12:20

Mozart
От:
Зарегистрирован: 2011-12-12
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Здравствуйте, есть такая задача:
Есть 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 ...")

Спасибо за советы …



Офлайн

#2 Авг. 3, 2012 13:25:36

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Может как-то так?



Офлайн

#3 Авг. 3, 2012 14:47:17

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Я бы сделал это так:

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)

Разность множеств делает предположение об отсутствии дубликатов и теряет порядок исходных данных.



Отредактировано fata1ex (Авг. 3, 2012 14:48:16)

Офлайн

#4 Авг. 3, 2012 20:17:01

Mozart
От:
Зарегистрирован: 2011-12-12
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Всем спасибо за ответы, но может кто сказать - почему мой вариант не работает? Он просто копирует все строки из файла 1 в файл 3 без учета блек листа, мне интересно где же я ошибку в коде допустил ?



Офлайн

#5 Авг. 3, 2012 22:04:49

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Думаю проще добавить вывод промежуточных результатов и посмотреть что с чем сравнивается.



Офлайн

#6 Авг. 3, 2012 22:07:32

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Всем спасибо за ответы, но может кто сказать - почему мой вариант не работает?
 if i2 != [x.rstrip("\n") for x in open("2.txt", "r")]

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


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


Отредактировано EBFE (Авг. 3, 2012 22:19:52)

Офлайн

#7 Авг. 4, 2012 01:19:23

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Пересчитывать файл в цикле, да и сложность O(len(input) * len(exclude)) не красит.

Офлайн

#8 Авг. 4, 2012 09:47:20

Mozart
От:
Зарегистрирован: 2011-12-12
Сообщения: 66
Репутация: +  0  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Всем спасибо, в общем сделал вот так вот:

# -*- 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 ...")

Все работает )



Отредактировано Mozart (Авг. 4, 2012 10:03:44)

Офлайн

#9 Авг. 4, 2012 11:40:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

fata1ex
black_list = set(fblack_list.read().splitlines())
black_list = set(fblack_list)



Офлайн

#10 Авг. 4, 2012 12:35:36

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Удаление из файла по блек листу

Mozart
Всем спасибо, в общем сделал вот так вот:
А зачем для каждой строчки открывать файл?

fata1ex, не будет работать, например, если у файлов разные переносы строки.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version