Найти - Пользователи
Полная версия: Выборка из большого списка в отдельные файлы.
Начало » Python для новичков » Выборка из большого списка в отдельные файлы.
1
quicky
Здравствуйте.

Потихоньку изучаю python, начал сразу с 3.2.2 Понемногу автоматизирую некоторые задачи на которые раньше уходило много времени.
И вот столкнулся с небольшой проблемой.

Есть два файла: 1) big_list.txt в котором около 400к многословных строк текста. 2) words.txt в котором около 350 однословных строк.
Надо каждую строку из файла words.txt проверить на вхождение в каждую строку из файла big_list.txt. И если вхождение есть то строку из файла big_list.txt записать в файл с именем строки из файла words.txt

по коду думаю будет понятней чем я написал :)

for string in open('big_list.txt'):
for word in open('words.txtt'):
cleanword = word.rstrip('\n')
file = open(cleanword + '.txt', 'a')
if cleanword in string:
file.write(string)
file.close()
дело в том что этот код работает, но ООООЧЕНЬ медленно. Запустил скрипт, но больше 20 минут ждать не стал.

Вопрос: Как можно увеличить скорость работы? Что-то совсем не могу сообразить.

Помогите плиз :)
Спасибо.
py.user.next
у тебя там ошибка - файл результата многократно открывается
ты его открыл, а писать в него ничего не надо, надо его закрыть, а ты его не закрыл

#!/usr/bin/env python3

if __name__ == '__main__':
with open('big_list.txt', encoding='utf-8') as fbl:
bls = set(fbl)
with open('words.txt', encoding='utf-8') as fw:
ws = set(w.strip() for w in fw)
for word in ws:
tup = tuple(s for s in bls if word in s)
if tup:
with open(word + '.txt', "w", encoding='utf-8') as fres:
print(*tup, sep='', end='', file=fres)
print("ok")
проверь этот по времени
quicky
py.user.next
у тебя там ошибка - файл результата многократно открывается
ты его открыл, а писать в него ничего не надо, надо его закрыть, а ты его не закрыл

#!/usr/bin/env python3

if __name__ == '__main__':
with open('big_list.txt', encoding='utf-8') as fbl:
bls = set(fbl)
with open('words.txt', encoding='utf-8') as fw:
ws = set(w.strip() for w in fw)
for word in ws:
tup = tuple(s for s in bls if word in s)
if tup:
with open(word + '.txt', "w", encoding='utf-8') as fres:
print(*tup, sep='', end='', file=fres)
print("ok")
проверь этот по времени
давало вот такую ошибку

Traceback (most recent call last):
File “<pyshell#1>”, line 3, in <module>
bls = set(fbl)
File “F:\Python32\lib\codecs.py”, line 300, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: ‘utf8’ codec can't decode byte 0xae in position 2681: invalid start byte
убрал везде encoding='utf-8' и заработало :)

Отсортировало все примерно за минуту.
Спасибо!

продолжаю изучение python :)
py.user.next
quicky
убрал везде encoding='utf-8'
нужно выставить правильную кодировку, это обязательно
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