Форум сайта python.su
Есть два .txt файла (utf-8)
В первом - набор некоторых символов. Одна строка - один символ.
Во втором - набор некоторых выражений. Одна строка - одно выражение (фраза).
Задача.
Для каждого символа в первом списке, т.е. файле, найти все слова во втором списке, в которых этот символ содержится и составить новый список следующего вида.
Символ_1
Все_фразы_содержащие_символ_1 (по строчке на каждую фразу)
пустая строка
Символ_2
Все_фразы_содержащие_символ_2 (по строчке на каждую фразу)
пустая строка
и т.д.
Вопрос. Как это сделать?
Собственно я не школьник и не студент, а просто делаю что-то вроде словаря. На компе есть только python. Опыт программирования - только математика в матлабе. Поэтому без помощи никак.
Офлайн
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)
Офлайн
Спасибо, но немного не то.
Замутил проверку.
Программа выхватила только одну строчку из второго файла для первого символа, а там этих строчек три.
И между блоками делает отступ не одну, а две пустых, строчки, но это я выкинул последний принт и все ок.
Так что проблема в том что копируется только первая попавшаяся строка, а не все.
P.S.
Хорошо бы еще узнать, как записать результат выполнения в новый текстовый файл.
Офлайн
Забавно. Но у меня все работает:
>>> 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')
Офлайн
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()
Офлайн
>>> ================================ RESTART ================================
>>>
п»їa
b
ruby
c
cron
decomposition
Отредактировано (Июль 18, 2011 13:00:08)
Офлайн
дайте файл с ключами - что-то странное в начале у него
Офлайн
s0rgСкорее всего это http://en.wikipedia.org/wiki/Byte_order_mark#UTF-8
дайте файл с ключами - что-то странное в начале у него
Офлайн
Я также о BOM подумал - но проверить не мешает )
Офлайн
s0rgДа это было оно.
Я также о BOM подумал - но проверить не мешает )
#print '\n'.join([l for l in lines if l.find(s) != -1])
Офлайн