#python
#python
Вопрос:
У меня есть текстовый файл, содержащий непрерывные разделы вопросов и ответов. Например:
Q1: some lines of text.
Answer: some lines of text.
Q2: some lines of text.
Answer: some lines of text.
Я хочу извлечь вопросы и ответы из текстового файла и поместить их в CSV-файл с двумя столбцами (Вопросы и ответы), где вопросы и ответы помещаются в соответствующие столбцы.
Это код, который у меня есть сейчас (все еще рудиментарный):
for line in file:
if line.strip() == 'Answer :':
print(line)
break
for line in file:
if line.startswith('Q'):
break
print(line)
Но при этом выводится только первый экземпляр ответа. Что мне делать?
Это пример файла:
Q1: What is the piston rod and the connecting rod?
Answer:
Piston Rod
A rod which is connected to the piston and the connecting rod is called piston rod.
Connecting Rod
The intermediate element between piston rod and crankshaft is the connecting rod.
Q2: State the constructional features and material requirements of connecting rod.
Answer:
1. The cross-section of connecting rod is I-section and the rods should be designed long, inorder to satisfy our need and
requirement.
2. The rods should have high strength and should not fail, when axial loads are applied on them.
Это скриншот части файла:
Это пример формата вопросов и ответов в текстовом файле:
Q1.
What is the piston rod and the connecting rod?
Answer :
Piston Rod
A rod which is connected to the piston and the connecting rod is called piston rod. It transmits gas pressure developed by
the fuel or steam to the crankshaft through connecting rod. One end of piston rod is attached to the piston by a tapered rod with a
nut and the other end is joined with the connecting rod, through a crosshead by a cotter-pin. These ends are having no revolving
movement and hence, they are considered as fixed ends.
Connecting Rod
The intermediate element between piston rod and crankshaft is the connecting rod. It consists of a small end which acts as
a connection for piston rod and a big end, that is usually split to accommodate the crank pin bearing shells. When the fuel force
is transmitted from piston rod to crankshaft, the connecting rod is also subjected to alternate tensile and compressive forces. The
compressive load is taken as the design load for the connecting rod, similar to the design of piston rod.
Q2.
State the constructional features and material requirements of connecting rod.
Answer :
1.
The cross-section of connecting rod is I-section and the rods should be designed long, inorder to satisfy our need and
requirement.
2.
The rods should have high strength and should not fail, when axial loads are applied on them.
3.
Connecting rods are made up of carbon steels or alloy steels of molybdenum and chromium, as these materials have high
tensile and compressive strengths.
Q3.
Write about the forces acting on the connecting rod.
OR
Explain the various types of stresses induced in the connecting rod.
Комментарии:
1. Не могли бы вы, пожалуйста, отредактировать свой пост, чтобы включить пример текстового файла? Серия из двух вопросов и ответов действительно помогла бы. Существует множество хороших способов разбиения текстового файла, но это будет во многом зависеть от форматирования вашего текстового файла.
2. Какой формат текстового файла? Обычные текстовые файлы не содержат жирных символов.
3. На самом деле это был PDF-файл, который я преобразовал в текст с помощью библиотеки PyMuPDF. Но скриншот был из файла pdf.
Ответ №1:
Я думаю, что использование полного текста вопроса в качестве ключевого словаря не требуется. Тогда вам нужно знать это заранее, чтобы восстановить ответы.
Вы могли бы использовать два отдельных списка или словаря, один для вопросов, другой для ответов. Если вы используете списки, просто убедитесь, что вопрос и соответствующие ответы находятся с одним и тем же индексом. Если вы используете словари, используйте один и тот же ключ (может быть просто прогрессивным числом) в каждом справочнике для вопроса и соответствующего ответа.
Вот пример с двумя словарями:
import re
questions = {}
answers = {}
c = 1
scanquestion = True
with open("myfile.txt", "r") as ff:
for line in ff:
if re.search(r"^Qd ", line) is not None:
scanquestion = True
questions[c] = line
elif 'Answer' in line:
scanquestion = False
answers[c] = ""
c = 1
elif line == 'n':
pass
else:
if scanquestion:
questions[c] = line
else:
answers[c-1] = line
print(questions)
print(answers)
questions[1]
это первый вопрос, answers[1]
это соответствующий ответ.
РЕДАКТИРОВАТЬ после комментариев и редактировать вопрос
После просмотра скриншота и прочтения комментариев, я думаю, у вас нет никаких новых строк между ответами и вопросами.
Я отредактировал свой ответ. Я использую регулярное выражение для поиска «Q1», «Q2» в начале строки, чтобы определить новый вопрос, и не делаю никаких предположений о наличии / отсутствии пустых строк (если они присутствуют, они пропускаются).
Комментарии:
1. Я получаю: KeyError: 1 (указывая на строку: вопросы [c] = строка)
2. Все ли ваши вопросы начинаются с «Q1», «Q2» и т.д.? Если нет, то в этом причина. Я отредактировал свой ответ, чтобы он был более общим.
3. Все вопросы начинались с «Q1», «Q2», но они в строковом формате, и ваша правка больше не выдавала ошибку. Но это не дает мне желаемого результата. Например, когда я попытался напечатать (вопросы [1]) и распечатать (ответы [1]), это дало мне весь текст в файле, просто не в формате словаря. Однако спасибо за вашу помощь.
4. Это странно. Я попробовал это, и он правильно разделяет вопросы и ответы. Вы уверены, что ваш
myfile.txt
соответствует формату, который вы опубликовали в вопросе? Есть ли одна пустая строка между каждой парой вопрос-ответ?5. Я думаю. Позвольте мне добавить скриншот части файла. Я отредактировал свой первоначальный вопрос и добавил его туда.
Ответ №2:
Давайте предположим, что ваш текстовый файл в виде:
Q1 : What is your name?
Answer: Joe
Q2: What is your last name?
Answer: Joe Joe
Теперь для создания словаря мы можем сделать:
df = open('myfile.txt', 'r')
df = df.readlines()
ques = []
ans = []
for items in df:
if "Q" in items:
ques.append(items)
elif "Answer" in items:
ans.append(items)
dictionary = {q:v for q, v in zip(ques, ans)}
print(dictionary)
> {'Q1 : What is your name?n': 'Answer: Joen',
'Q2: What is your last name?n': 'Answer: Joe Joe'}
Я также предполагаю, что за каждым вопросом следует его ответ. Если нет, возможно, потребуется некоторое обновление
Комментарии:
1. Когда я попробовал ваш код, { ‘Q1. n’: ‘Answer: n’, ‘Q2. n’: ‘Answer: n’}. И я не знаю, не ошибаюсь ли я в этом, но что я действительно намерен сделать, так это классифицировать все вопросы и ответы и вставить их в базу данных (например, mongodb). Я читал, что обычно это делается путем вставки в формате json, вот почему я решил использовать этот метод. Если бы был лучший метод, пожалуйста, я хотел бы знать.
2. Кроме того, некоторые вопросы и ответы содержатся более чем в одной строке. Но ваш код, похоже, печатает вопросы и ответы рядом с ними.