臨床検査技師国家試験演習サイト
今までは各年度ごとの演習のみだったが、分野別の演習も追加。
出題分野の追加
臨床検査技師国家試験は、年度によらず出題分野が以下のようにはっきりと決まっている。
分野 | 問題番号 |
臨床検査総論 | 1-10 |
臨床検査医学総論 | 11-15 |
臨床生理学 | 16-28 |
臨床化学 | 29-44 |
病理組織細胞学 | 45-58 |
臨床血液学 | 59-67 |
臨床微生物学 | 68-78 |
臨床免疫学 | 79-89 |
公衆衛生学 | 90-94 |
医用工学概論 | 95-100 |
したがって、以下のコードでまず作成済の各年度のJSONファイルにsubjectを埋め込む。
import json
# 番号と科目のマッピング
subject_mapping = {
(1, 10): "臨床検査総論",
(11, 15): "臨床検査医学総論",
(16, 28): "臨床生理学",
(29, 44): "臨床化学",
(45, 58): "病理組織細胞学",
(59, 67): "臨床血液学",
(68, 78): "臨床微生物学",
(79, 89): "臨床免疫学",
(90, 94): "公衆衛生学",
(95, 100): "医用工学概論"
}
def assign_subjects(file_name):
# JSON ファイルを読み込む
with open(file_name, 'r', encoding='utf-8') as f:
data = json.load(f)
# すべての問題に対して "subject" を割り当てる
for item in data:
number = item["number"]
for range_, subject in subject_mapping.items():
if range_[0] <= number <= range_[1]:
item["subject"] = subject
break
# 結果を新しい JSON ファイルに書き出す
with open(file_name, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 関数を実行
for i in range(65, 70):
assign_subjects(f"/Users/Documents/LabDepartment/lab_exam_app/data/{i:0>3}/question_{i:0>3}_01.json")
for i in range(65, 70):
assign_subjects(f"/Users/Documents/LabDepartment/lab_exam_app/data/{i:0>3}/question_{i:0>3}_02.json")
まず、各分野ごとのフォルダーを作成
こちらは簡単なコードで分野別のフォルダを作成。
import os
data_dir = "/Users/Documents/LabDepartment/lab_exam_app/data"
# 分野のリストを定義
SUBJECT_IDS = ["CLT", "CLM", "CP", "CC", "PHC", "CH", "CM", "CI", "PH", "IME"]
# 分野ごとのフォルダを作成
for subject_id in SUBJECT_IDS:
os.makedirs(os.path.join(data_dir, subject_id), exist_ok=True)
import shutil
data_dir = "/Users/tk/Documents/LabDepartment/lab_exam_app/data"
SUBJECT_IDS = ["CLT", "CLM", "CP", "CC", "PHC", "CH", "CM", "CI", "PH", "IME"]
# 各分野のフォルダに対応するファイルを移動
for subject_id in SUBJECT_IDS:
for suffix in ["_question.json", "_ans.json"]:
src_file = os.path.join(data_dir, subject_id + suffix)
dst_dir = os.path.join(data_dir, subject_id)
# ファイルが存在する場合のみ移動操作を行う
if os.path.exists(src_file):
shutil.move(src_file, dst_dir)
分野ごとのJSONファイルの作成
この分野情報を用いて、各分野ごとのフォルダを作り、そこに分野別のJSONファイルを投げ込んでいく。
import json
import os
SUBJECT_IDS = {
"CLT": "臨床検査総論",
"CLM": "臨床検査医学総論",
"CP": "臨床生理学",
"CC": "臨床化学",
"PHC": "病理組織細胞学",
"CH": "臨床血液学",
"CM": "臨床微生物学",
"CI": "臨床免疫学",
"PH": "公衆衛生学",
"IME": "医用工学概論"
}
# ディレクトリパスを設定
data_dir = "/Users/Documents/LabDepartment/lab_exam_app/data"
# すべての年度にわたる各分野の問題と解答を保持するためのディクショナリを作成
subjects_data = {subject_id: {"questions": [], "answers": []} for subject_id in SUBJECT_IDS.keys()}
# 65から69までの5年分を処理
for year in range(65, 70):
for half in ['01', '02']:
questions_file = os.path.join(data_dir, f'0{year}/question_0{year}_{half}.json')
# JSONファイルを読み込み
with open(questions_file, 'r') as qf:
questions = json.load(qf)
# 分野ごとに問題を分けてディクショナリに追加
for subject_id, subject_name in SUBJECT_IDS.items():
subject_questions = [q for q in questions if q['subject'] == subject_name]
for i, q in enumerate(subject_questions, start=1):
q['year'] = year
q['half'] = half
subjects_data[subject_id]['questions'].append(q)
# 各分野ごとに問題と解答のリストを取り出し、新たに問題番号を割り振り
for subject_id, data in subjects_data.items():
questions = data['questions']
for i, question in enumerate(questions, start=1):
question['number'] = i
output_questions_file = os.path.join(data_dir, f'{subject_id}_question.json')
# JSONファイルを整形して出力
with open(output_questions_file, 'w') as oqf:
json.dump(questions, oqf, ensure_ascii=False, indent=2)
分野別の回答も作成
同様に、分野別の回答も作成していく。こちらは番号で処理。
import os
import json
data_dir = "/Users/Documents/LabDepartment/lab_exam_app/data"
# 各分野の範囲を定義
SUBJECT_RANGES = {
"CLT": range(1, 11),
"CLM": range(11, 16),
"CP": range(16, 29),
"CC": range(29, 45),
"PHC": range(45, 59),
"CH": range(59, 68),
"CM": range(68, 79),
"CI": range(79, 90),
"PH": range(90, 95),
"IME": range(95, 101)
}
# 分野ごとの回答データを格納する辞書を初期化
subjects_data = {k: {} for k in SUBJECT_RANGES.keys()}
# 各年度の回答データを読み込み、適切な分野に分けて格納
for year in range(65, 70): # 第65回から第69回まで
for half in range(1, 3): # 午前(1)から午後(2)まで
half_char = "A" if half == 1 else "B"
answers_file = os.path.join(data_dir, f"0{year}", f'ans_0{year}.json')
with open(answers_file, 'r') as af:
answers = json.load(af)
for subject_id, subject_range in SUBJECT_RANGES.items():
for number in subject_range:
answer_key = f"{year}{half_char}{number:03}"
answer_value = answers.get(answer_key)
subject_key = f"{subject_id}{len(subjects_data[subject_id]) + 1:03}"
subjects_data[subject_id][subject_key] = answer_value
# 分野ごとにJSONファイルに出力
for subject_id, subject_answers in subjects_data.items():
with open(os.path.join(data_dir, f"{subject_id}_ans.json"), 'w') as f:
json.dump(subject_answers, f, ensure_ascii=False, indent=4)
画像の収集
色々考えた結果、分野別に画像を再度収集しフォルダに配置するのが一番簡単だと思い、実行。まずは各年度の画像フォルダから分野別の画像を収集。分野が公衆衛生学がだったら、”PH_001.jpg”などと新しい名前をつけていく。
import os
import json
import shutil
SUBJECT_IDS = {
"臨床検査総論": "CLT",
"臨床検査医学総論": "CLM",
"臨床生理学": "CP",
"臨床化学": "CC",
"病理組織細胞学": "PHC",
"臨床血液学": "CH",
"臨床微生物学": "CM",
"臨床免疫学": "CI",
"公衆衛生学": "PH",
"医用工学概論": "IME"
}
for root, dirs, files in os.walk('/Users/Documents/LabDepartment/lab_exam_app/data'):
for subject in SUBJECT_IDS.values():
question_file = f"{subject}_question.json"
if question_file in files:
json_file_path = os.path.join(root, question_file)
with open(json_file_path, 'r') as json_file:
data = json.load(json_file)
# 新しいファイル名に使用する番号
image_counter = 1
for item in data:
if 'image' in item:
old_image_path = f"/Users/Documents/LabDepartment/lab_exam_app/static/0{item['year']}/{item['half']}_pic/{item['image']}"
subject_dir = SUBJECT_IDS[item['subject']]
new_dir_path = f"/Users/Documents/LabDepartment/lab_exam_app/static/{subject_dir}/{subject_dir}_pic"
if not os.path.exists(new_dir_path):
os.makedirs(new_dir_path)
# 新しい画像ファイル名を作成: 主題名 + 三桁の番号
new_image_name = f"{subject_dir}_{str(image_counter).zfill(3)}.jpg"
new_image_path = os.path.join(new_dir_path, new_image_name)
shutil.copy2(old_image_path, new_image_path)
# 画像番号をインクリメント
image_counter += 1
JSONファイルの画像ファイル名も変更
上記に伴い、もともとのJSONファイルの方では画像名が”page_10.jpg”などであったので、こちらも修正していく。
import os
import json
import shutil
SUBJECT_IDS = {
"臨床検査総論": "CLT",
"臨床検査医学総論": "CLM",
"臨床生理学": "CP",
"臨床化学": "CC",
"病理組織細胞学": "PHC",
"臨床血液学": "CH",
"臨床微生物学": "CM",
"臨床免疫学": "CI",
"公衆衛生学": "PH",
"医用工学概論": "IME"
}
for root, dirs, files in os.walk('/Users/Documents/LabDepartment/lab_exam_app/data'):
for subject in SUBJECT_IDS.values():
question_file = f"{subject}_question.json"
if question_file in files:
json_file_path = os.path.join(root, question_file)
with open(json_file_path, 'r') as json_file:
data = json.load(json_file)
# 新しいファイル名に使用する番号
image_counter = 1
for item in data:
if 'image' in item:
old_image_path = f"/Users/Documents/LabDepartment/lab_exam_app/static/0{item['year']}/{item['half']}_pic/{item['image']}"
subject_dir = SUBJECT_IDS[item['subject']]
new_dir_path = f"/Users/Documents/LabDepartment/lab_exam_app/static/{subject_dir}/{subject_dir}_pic"
if not os.path.exists(new_dir_path):
os.makedirs(new_dir_path)
# 新しい画像ファイル名を作成: 主題名 + 三桁の番号
new_image_name = f"{subject_dir}_{str(image_counter).zfill(3)}.jpg"
item['image'] = new_image_name # 'image'キーの値を新しい画像名に更新
new_image_path = os.path.join(new_dir_path, new_image_name)
shutil.copy2(old_image_path, new_image_path)
# 画像番号をインクリメント
image_counter += 1
# 更新されたデータを同じJSONファイルに書き出し
with open(json_file_path, 'w') as json_file:
json.dump(data, json_file, ensure_ascii=False, indent=2)
できあがり
臨床検査技師国家試験演習
臨床検査技師国家試験のためのオンライン演習サイト。過去の試験問題を使用した試験のシミュレーションを提供し、あなたの試験対策をサポートします。
比較的軽微な変更で、分野別出題も実装できてよかった。FileZillaでアップロードして完了。
関連記事
JSONファイル中にhtmlリンクやimgリンクを入れ込む
ChatGTPで臨床検査技師国家試験演習Webサイトを作成
関連リンク
臨床検査技師国家試験演習
臨床検査技師国家試験のためのオンライン演習サイト。過去の試験問題を使用した試験のシミュレーションを提供し、あなたの試験対策をサポートします。
コメント