Уведомления

Группа в Telegram: @pythonsu

#1 Июль 17, 2011 23:06:24

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

Сортировка тестовых файлов.

Есть два .txt файла (utf-8)
В первом - набор некоторых символов. Одна строка - один символ.
Во втором - набор некоторых выражений. Одна строка - одно выражение (фраза).
Задача.
Для каждого символа в первом списке, т.е. файле, найти все слова во втором списке, в которых этот символ содержится и составить новый список следующего вида.

Символ_1
Все_фразы_содержащие_символ_1 (по строчке на каждую фразу)
пустая строка
Символ_2
Все_фразы_содержащие_символ_2 (по строчке на каждую фразу)
пустая строка

и т.д.

Вопрос. Как это сделать?

Собственно я не школьник и не студент, а просто делаю что-то вроде словаря. На компе есть только python. Опыт программирования - только математика в матлабе. Поэтому без помощи никак.



Офлайн

#2 Июль 17, 2011 23:16:46

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

Сортировка тестовых файлов.

lines = open('file2.txt').readlines()
for s in open('file1.txt'):
s = s.strip()
print s
print '\n'.join([l for l in lines if l.find(s) != -1])
print ''
нет возможности сейчас проверить, как-то так должно работать



Отредактировано (Июль 17, 2011 23:19:41)

Офлайн

#3 Июль 18, 2011 11:32:15

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

Сортировка тестовых файлов.

Спасибо, но немного не то.

Замутил проверку.
Программа выхватила только одну строчку из второго файла для первого символа, а там этих строчек три.
И между блоками делает отступ не одну, а две пустых, строчки, но это я выкинул последний принт и все ок.

Так что проблема в том что копируется только первая попавшаяся строка, а не все.


P.S.
Хорошо бы еще узнать, как записать результат выполнения в новый текстовый файл.



Офлайн

#4 Июль 18, 2011 12:26:49

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

Сортировка тестовых файлов.

Забавно. Но у меня все работает:

>>> lines = open('file2.txt').readlines()
>>> lines
['python\n', 'php\n', 'ruby\n', 'cron\n', 'delay\n', 'some other non-interesting string\n', 'ada\n', 'daemon\n', 'decomposition\n']
>>> for s in open('file1.txt'):
... s = s.strip()
... print s
... print ''.join([l for l in lines if l.find(s) != -1])
...
a
delay
ada
daemon

b
ruby

c
cron
decomposition
Для вывода в файл, поместите в начало кода
import sys
sys.stdout = open('file3.txt', 'w')



Офлайн

#5 Июль 18, 2011 12:39:02

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Сортировка тестовых файлов.

import sys

def load_file(file_name):
lines = list()
with open(file_name) as fd:
for line in fd:
line = line.strip()
if line:
lines.append(line)
return lines

def process_files(key_file, values_file):
keys = load_file(key_file)
vals = load_file(values_file)
data = dict()

for key in keys:
for val in vals:
if key in val:
data.setdefault(key, list()).append(val)
return data

def put_results(res, fout=sys.stdout):
for dkey, dval in res.iteritems():
fout.write("%s\n"%dkey)
for ival in dval:
fout.write("%s\n"%ival)
fout.write('\n')

processed = process_files('file1', 'file2')

#print results
put_results(processed)

#write to file
my_out = open('file_out', 'w')
put_results(processed, my_out)
my_out.flush()
my_out.close()

Офлайн

#6 Июль 18, 2011 12:49:49

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

Сортировка тестовых файлов.

>>> ================================ RESTART ================================
>>>
п»їa

b
ruby

c
cron
decomposition
Вот мой результат на Ваш пример.
Может проблема в самих тхт и в символах форматирования внутри них. Но в чем конкретно - вопрос.
Первый символ, как видно, не работает, а третий уже ОК.

Апдейт:

Спасибо за помощь kachayev, s0rg. Кажись получилось.



Отредактировано (Июль 18, 2011 13:00:08)

Офлайн

#7 Июль 18, 2011 12:56:16

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Сортировка тестовых файлов.

дайте файл с ключами - что-то странное в начале у него

Офлайн

#8 Июль 18, 2011 17:00:33

nerijus
От:
Зарегистрирован: 2010-06-03
Сообщения: 93
Репутация: +  1  -
Профиль   Отправить e-mail  

Сортировка тестовых файлов.

s0rg
дайте файл с ключами - что-то странное в начале у него
Скорее всего это http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8



Офлайн

#9 Июль 18, 2011 17:07:50

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Сортировка тестовых файлов.

Я также о BOM подумал - но проверить не мешает )

Офлайн

#10 Июль 24, 2011 15:39:49

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

Сортировка тестовых файлов.

s0rg
Я также о BOM подумал - но проверить не мешает )
Да это было оно.

Однако возникла кое-какая другая проблема.Это касается как скрипта kachayev, так и скрипта s0rg.
В общем смысл таков: скрипт читает (или выводит) не все строки в первом файле. Тоесть, если я закаменчиваю последнюю строку в скрипте kachayev, например
#print '\n'.join([l for l in lines if l.find(s) != -1])
я по идее должен получить файл аналогичный первому файлу с символами, однако я получаю файл, в котором число строк такое же, но некоторые строки пустые.

При исполненни обоих скриптов в выходном файле там, где потеряна строка с символом из первого файла я получаю среди списков необходимого мне типа просто наборы слов без ключевого символа над ними. При этом эти слова не соответсвуют пропущенному символу. Тоесть в списке есть слова, в которые этот символ входит, но есть еще и куча других, в которых его нет.

Я подумал, что что-то тут неладно может быть с кодировкой, но пропускаемые символы с виду между собой не связаны.
Что касается самих файлов, то это, как я говорил utf-8, а символы - китайские/японские иероглифы, если верить Ворду - из “набора ККЯ из шестандц. Юникода” . Собственно я делаю на общественных началах некоторый словарь известных слов, содержащих известные иероглифы для последующего использования в другой программе, но я думаю это к делу не относится.

Собственно на что конкретно грешить я и не понимаю.

Чтобы не быть голословным подкину сами файлы и оба выходных. С закоменченной строкой вывода в скрипте и с нормальными скриптами.
Результат у обоих скриптов одинаковый (теряются одни и те же символы), за исключением порядка следования групп ключевых символов.

http://rghost.ru/15609311



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version