Как извлечь текст из файла с идентификатором?

у меня есть два файла. один содержит идентификатор, а другой содержит предложения для каждого идентификатора, но с небольшими изменениями, как в этом примере.

Файл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')

но получил неправильные данные, так как я не мог хорошо поймать правильную строку

Что случилось с пробелом? Я написал решение в Pandas, предполагая, что вы используете два пробела для разделителей столбцов, а другой пробел был значительным, но я получил другой результат. Например, как я это делаю, строка 2 в File1 анализируется как ['222', ' some_text_2', 'some_text_2'] (обратите внимание на начальный пробел во второй ячейке). Так что кажется, что пробелы на самом деле не имеют для вас значения, верно?

wjandrea 16.05.2022 03:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Один из способов достижения результата — сохранить пару 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.

Большое спасибо, я попробовал ваш ответ, но получил идентификаторы только без текста.

sammo 15.05.2022 23:06

Тогда либо в вашем файле предложений нет записи для идентификатора файла, либо формат содержимого файла не соответствует образцу, указанному в приведенном выше примере. Код работает для приведенного выше примера содержимого файла.

LeelaPrasad 15.05.2022 23:14

я думаю, я понял, в чем проблема со словарем, когда я распечатываю его, чтобы увидеть его содержимое, которое я прочитал {'f77a619f6ccc449f915b44bdc0d6d8f0\tWell': ', он взял первое слово из второго столбца, я не знаю, почему, поскольку я разделил их на столбцы

sammo 15.05.2022 23:44
Ответ принят как подходящий

Основной подход

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 15.05.2022 23:07

@sammo Я проверил точно те же данные, что и в вопросе, и работает. Может ли быть так, что в файле 2 некоторые_текст1 или 2 содержат пробелы?

cards 16.05.2022 00:07

файлы2 содержат символ табуляции после каждого столбца

sammo 16.05.2022 00:11

@саммо Вот оно! Я предполагал пробелы! (было не ясно, извините!)

cards 16.05.2022 00:14

Я исправил Спасибо большое l.split('\t')

sammo 16.05.2022 00:19

если здесь обновления: l.split('\\t') и f'{l1} {t1} {t2.strip()}\n', если столбцы в File2 разделены \t

cards 16.05.2022 00:24

Другие вопросы по теме