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

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

и т.д.

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

Собственно я не школьник и не студент, а просто делаю что-то вроде словаря. На компе есть только python. Опыт программирования - только математика в матлабе. Поэтому без помощи никак.
kachayev
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 ''
нет возможности сейчас проверить, как-то так должно работать
Oddler
Спасибо, но немного не то.

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

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


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

>>> 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')
s0rg
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()
Oddler
>>> ================================ RESTART ================================
>>>
п»їa

b
ruby

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

Апдейт:

Спасибо за помощь kachayev, s0rg. Кажись получилось.
s0rg
дайте файл с ключами - что-то странное в начале у него
nerijus
s0rg
дайте файл с ключами - что-то странное в начале у него
Скорее всего это http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8
s0rg
Я также о BOM подумал - но проверить не мешает )
Oddler
s0rg
Я также о BOM подумал - но проверить не мешает )
Да это было оно.

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

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

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

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

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

http://rghost.ru/15609311
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