у меня есть два файла. один содержит идентификатор, а другой содержит предложения для каждого идентификатора, но с небольшими изменениями, как в этом примере.
Файл1:
111_3232
111_ewe2
111_3434
222_3843h
222_39092
Файл2:
111 some_text_1 some_text_1
222 some_text_2 some_text_2
мне нужно сделать файл с идентификатором и такими предложениями, как
111_3232 some_text_1 some_text_1
111_ewe2 some_text_1 some_text_1
111_3434 some_text_1 some_text_1
222_3843h some_text_2 some_text_2
222_39092 some_text_2 some_text_2
я попробовал этот код
import os
f = open("id","r")
ff = open("result","w")
fff = open("sentences.txt","r")
List = fff.readlines()
i =0
for line_id in f.readlines():
for line_sentence in range(len(List)):
if line_id in List[i]:
ff.write(line_sentence)
else :
i+=1
но получил
if line_id in List[i]:
IndexError: list index out of range
так как я получил всю строку из файла2, а не только id... есть ли способ лучше, чем я делаю
РЕДАКТИРОВАТЬ
я пытался использовать panads, но я плохо знаком с этим кодом
df = pd.read_csv('sentence.csv')
for line_id in f.readline():
for line_2 in df.iloc[:, 0] :
for (idx, row) in df.iterrows():
if line_id in line_2:
ff.write(str(row) +'\n')
else :
ff.write("empty" +'\n')
но получил неправильные данные, так как я не мог хорошо поймать правильную строку
Один из способов достижения результата — сохранить пару sentences
и file_id
в словаре и выполнить итерацию по содержимому файла id, чтобы получить результат.
sentences_dict = {}
# read all sentences into a dictionary as key value pair
with open("sentences.txt", "r") as sentences_file:
for line in sentences_file.read().splitlines():
split_lines = line.split(" ")
sentences_dict.update({split_lines[0].strip(): " ".join(split_lines[1:])})
result_file = open("result.txt", "w")
# iterate over id file and match the starting text
with open("id.txt", "r") as id_file:
for file_id in id_file.read().splitlines():
txt = sentences_dict.get(file_id.split("_")[0], "")
result_file.write(f"{file_id}{txt}\n")
result_file.close()
Убедитесь, что вы всегда закрываете файл явно, если только вы не открываете его вместе с ключевым словом with
.
Большое спасибо, я попробовал ваш ответ, но получил идентификаторы только без текста.
Тогда либо в вашем файле предложений нет записи для идентификатора файла, либо формат содержимого файла не соответствует образцу, указанному в приведенном выше примере. Код работает для приведенного выше примера содержимого файла.
я думаю, я понял, в чем проблема со словарем, когда я распечатываю его, чтобы увидеть его содержимое, которое я прочитал {'f77a619f6ccc449f915b44bdc0d6d8f0\tWell': '
, он взял первое слово из второго столбца, я не знаю, почему, поскольку я разделил их на столбцы
Основной подход
with open('file1.txt', 'r') as fd1, open('file2.txt', 'r') as fd2:
lines1 = fd1.read().split() # remove \n
lines2 = fd2.readlines()
new_text = ''
for l1 in lines1:
for id_, t1, t2 in (l.split() for l in lines2):
if l1.startswith(id_):
new_text += f'{l1} {t1} {t2}\n'
with open('file3.txt', 'w') as fd:
fd.write(new_text.strip())
Большое спасибо, я пробовал, но получилось for id_, t1, t2 in (l.split() for l in lines2): ValueError: too many values to unpack (expected 3)
@sammo Я проверил точно те же данные, что и в вопросе, и работает. Может ли быть так, что в файле 2 некоторые_текст1 или 2 содержат пробелы?
файлы2 содержат символ табуляции после каждого столбца
@саммо Вот оно! Я предполагал пробелы! (было не ясно, извините!)
Я исправил Спасибо большое l.split('\t')
если здесь обновления: l.split('\\t')
и f'{l1} {t1} {t2.strip()}\n'
, если столбцы в File2 разделены \t
Что случилось с пробелом? Я написал решение в Pandas, предполагая, что вы используете два пробела для разделителей столбцов, а другой пробел был значительным, но я получил другой результат. Например, как я это делаю, строка 2 в
File1
анализируется как['222', ' some_text_2', 'some_text_2']
(обратите внимание на начальный пробел во второй ячейке). Так что кажется, что пробелы на самом деле не имеют для вас значения, верно?