从输入 import List, Dict, Optional
def readPatientsFromFile(文件名): 患者 = {} 尝试: 用 open(fileName, 'r') 作为 f: 对于 line_num,枚举中的行(f,start=1): # 从文件中解析患者数据 数据 = line.strip().split(',')
# check if there are 8 fields
if len(data) != 8:
print(f"Invalid number of fields ({len(data)}) in line: {line_num}")
continue
try:
patientID = int(data[0])
except ValueError:
print(f"Invalid data type in line: {line_num}")
continue
try:
visitData = [data[i:i+7] for i in range(1, len(data), 7)]
visits = [[visit[0], float(visit[1]), int(visit[2]), int(visit[3]), int(visit[4]), int(visit[5]), int(visit[6])] for visit in visitData]
except (ValueError, IndexError):
print(f"Invalid data type in line: {line_num}")
continue
# check if temperature is in range
if not (35 <= visits[0][1] <= 42):
print(f"Invalid temperature value ({visits[0][1]}) in line: {line_num}")
continue
# check if heart rate is in range
if not (30 <= visits[0][2] <= 180):
print(f"Invalid heart rate value ({visits[0][2]}) in line: {line_num}")
continue
# check if respiratory rate is in range
if not (5 <= visits[0][3] <= 40):
print(f"Invalid respiratory rate value ({visits[0][3]}) in line: {line_num}")
continue
# check if systolic blood pressure is in range
if not (70 <= visits[0][4] <= 200):
print(f"Invalid systolic blood pressure value ({visits[0][4]}) in line: {line_num}")
continue
# check if diastolic blood pressure is in range
if not (40 <= visits[0][5] <= 120):
print(f"Invalid diastolic blood pressure value ({visits[0][5]}) in line: {line_num}")
continue
# check if oxygen saturation is in range
if not (70 <= visits[0][6] <= 100):
print(f"Invalid oxygen saturation value ({visits[0][6]}) in line: {line_num}")
continue
# add patient data to dictionary
if patientID in patients:
patients[patientID].extend(visits)
else:
patients[patientID] = visits
except FileNotFoundError:
print(f"The file '{fileName}' could not be found.")
except Exception as e:
print("An unexpected error occurred while reading the file.")
print(e)
return patients
def displayPatientData(患者,patientId=0): # 打印所有患者或指定患者 ID 的患者数据 如果不是实例(患者,字典): print("错误:患者应该是一本字典") 返回
if patientId != 0 and not isinstance(patientId, int):
print("Error: patientId should be an integer")
return
if patientId != 0 and patientId < 0:
print("Error: patientId should be a positive integer")
return
if patientId == 0:
for pid in patients:
print(f"Patient ID: {pid}")
for visit in patients[pid]:
print(f" {' '*2}Visit Date: {visit[0]}")
print(f" {' '*3}Temperature: {'%.2f' % visit[1]} C")
print(f" {' '*3}Heart Rate: {visit[2]} bpm")
print(f" {''*3}Respiratory Rate: {visit[3]} bpm")
print(f" {''*3}Systolic Blood Pressure: {visit[4]} mmHg")
print(f" {''*3}Diastolic Blood Pressure: {visit[5]} mmHg")
print(f" {''*3}Oxygen Saturation: {visit[6]} %")
else:
if patientId not in patients:
print(f"Patient with ID {patientId} not found.")
return
print(f"Patient ID: {patientId}")
for visit in patients[patientId]:
print(f" {' '*2}Visit Date: {visit[0]}")
print(f" {' '*3}Temperature: {'%.2f' % visit[1]} C")
print(f" {' '*3}Heart Rate: {visit[2]} bpm")
print(f" {''*3}Respiratory Rate: {visit[3]} bpm")
print(f" {''*3}Systolic Blood Pressure: {visit[4]} mmHg")
print(f" {''*3}Diastolic Blood Pressure: {visit[5]} mmHg")
print(f" {''*3}Oxygen Saturation: {visit[6]} %")
def displayStats(患者,patientId=0): """ 打印所有患者或指定患者的每个生命体征的平均值。
patients: A dictionary of patient IDs, where each patient has a list of visits.
patientId: The ID of the patient to display vital signs for. If 0, vital signs will be displayed for all patients.
"""
if not isinstance(patientId, int):
print("Error: 'patientId' should be an integer.")
return
if not isinstance(patients, dict):
print("Error: 'patients' should be a dictionary.")
return
if patientId == 0:
print("Vital Signs for All Patients:")
for patient in patients:
print("Patient ID:", patient)
patient_data = patients[patient]
num_visits = len(patient_data)
if num_visits == 0:
print(" No data found.")
else:
total_temp, total_hr, total_rr, total_sbp, total_dbp, total_spo2 = 0, 0, 0, 0, 0, 0
for visit in patient_data:
total_temp += visit[1]
total_hr += visit[2]
total_rr += visit[3]
total_sbp += visit[4]
total_dbp += visit[5]
total_spo2 += visit[6]
avg_temp = total_temp / num_visits
avg_hr = total_hr / num_visits
avg_rr = total_rr / num_visits
avg_sbp = total_sbp / num_visits
avg_dbp = total_dbp / num_visits
avg_spo2 = total_spo2 / num_visits
print(" Average temperature: ", "{:.2f}".format(avg_temp), "C")
print(" Average heart rate: ", "{:.2f}".format(avg_hr), "bpm")
print(" Average respiratory rate: ", "{:.2f}".format(avg_rr), "bpm")
print(" Average systolic blood pressure: ", "{:.2f}".format(avg_sbp), "mmHg")
print(" Average diastolic blood pressure: ", "{:.2f}".format(avg_dbp), "mmHg")
print(" Average oxygen saturation: ", "{:.2f}".format(avg_spo2), "%")
else:
if patientId not in patients:
print("No data found")
return
print("Vital Signs for Patient", patientId, ":")
patient_data = patients[patientId]
num_visits = len(patient_data)
if num_visits == 0:
print(" No data found.")
else:
total_temp, total_hr, total_rr, total_sbp, total_dbp, total_spo2 = 0, 0, 0, 0, 0, 0
for visit in patient_data:
total_temp += visit[1]
total_hr += visit[2]
total_rr += visit[3]
total_sbp += visit[4]
total_dbp += visit[5]
total_spo2 += visit[6]
avg_temp = total_temp / num_visits
avg_hr = total_hr / num_visits
avg_rr = total_rr / num_visits
avg_sbp = total_sbp / num_visits
avg_dbp = total_dbp / num_visits
avg_spo2 = total_spo2 / num_visits
# Print the averages for this patient
print(" Average temperature:", "%.2f" % avg_temp, "C")
print(" Average heart rate:", "%.2f" % avg_hr, "bpm")
print(" Average respiratory rate:", "%.2f" % avg_rr, "bpm")
print(" Average systolic blood pressure:", "%.2f" % avg_sbp, "mmHg")
print(" Average diastolic blood pressure:", "%.2f" % avg_dbp, "mmHg")
print(" Average oxygen saturation:", "%.2f" % avg_spo2, "%")
从日期时间导入日期时间
def addPatientData(患者、patient_id、日期、temp、hr、rr、sbp、dbp、spo2、file_path): """ 此函数将患者数据添加到患者字典中。 它还将数据写入 file_path 指定的文件。 """ 尝试: # 检查日期格式 datetime.strptime(日期,'%Y-%m-%d') # 检查温度范围 如果不是 (35.0 <= float(temp) <= 42.0): print("Invalid temperature. Please enter a temperature between 35.0 and 42.0 Celsius.") return # check heart rate range if not (30 <= int(hr) <= 180): print("Invalid heart rate. Please enter a heart rate between 30 and 180 bpm.") return # check respiratory rate range if not (5 <= int(rr) <= 40): print("Invalid respiratory rate. Please enter a respiratory rate between 5 and 40 bpm.") return # check systolic blood pressure range if not (70 <= int(sbp) <= 200): print("Invalid systolic blood pressure. Please enter a systolic blood pressure between 70 and 200 mmHg.") return # check diastolic blood pressure range if not (40 <= int(dbp) <= 120): print("Invalid diastolic blood pressure. Please enter a diastolic blood pressure between 40 and 120 mmHg.") return # check oxygen saturation range if not (70 <= int(spo2) <= 100): print("Invalid oxygen saturation. Please enter an oxygen saturation between 70 and 100%.") return # create a dictionary for the new visit data visit = {'date': date, 'temperature': temp, 'heart_rate': hr, 'respiratory_rate': rr, 'systolic_blood_pressure': sbp, 'diastolic_blood_pressure': dbp, 'oxygen_saturation': spo2} # add the visit data to the patient's list of visits if patient_id in patients: patients[patient_id]['visits'].append(visit) else: patients[patient_id] = {'id': patient_id, 'visits': [visit]} # write the updated patient data to the file with open(file_path, 'w') as f: for patient in patients.values(): f.write(f"{patient['id']}\n") for visit in patient['visits']: f.write(f"{visit['date']},{visit['temperature']},{visit['heart_rate']},{visit['respiratory_rate']}," f"{visit['systolic_blood_pressure']},{visit['diastolic_blood_pressure']},{visit['oxygen_saturation']}\n") print(f"Visit is saved successfully for Patient #{patient_id}") except ValueError: print("Invalid date format. Please enter date in the format ‘yyyy-mm-dd’.") except: print("An unexpected error occurred while adding new data.") """ This function displays all patient data or the data for a specific patient ID. """ if patient_id is None: # display all patient data for patient in patients.values(): print(f"Patient ID: {patient['id']}") for visit in patient['visits']: print(f" Visit Date: {visit['date']}") print(f" Temperature: {visit['temperature']:.2f} C") print(f" Heart Rate: {visit['heart_rate']} bpm") print(f" Respiratory Rate: {visit['respiratory_rate']} bpm") print(f" Systolic Blood Pressure: {visit['systolic_blood_pressure']} mmHg") print(f" Diastolic Blood Pressure: {visit['diastolic_blood_pressure']} mmHg") print(f" Oxygen Saturation: {visit['oxygen_saturation']}%") else: # display data for a specific patient ID if patient_id in patients: patient = patients[patient_id] print(f"Patient ID: {patient['id']}") for visit in patient['visits']: print(f" Visit Date: {visit['date']}") print(f" Temperature: {visit['temperature']:.2f} C") print(f" Heart Rate: {visit['heart_rate']} bpm") print(f" Respiratory Rate: {visit['respiratory_rate']} bpm") print(f" Systolic Blood Pressure: {visit['systolic_blood_pressure']} mmHg") print(f" Diastolic Blood Pressure: {visit['diastolic_blood_pressure']} mmHg") print(f" Oxygen Saturation: {visit['oxygen_saturation']}%") else: print("Patient ID not found."
从日期时间导入日期时间 def findVisitsByDate(患者,年=无,月=无): 访问量 = []
for patient_id, patient_data in patients.items():
for visit in patient_data['visits']:
# Check if the visit has complete date information
if len(visit['date']) != 10:
continue
try:
visit_date = datetime.strptime(visit['date'], '%Y-%m-%d')
except ValueError:
continue
# Check if the year and/or month filter is provided and valid
if year is not None and visit_date.year != year:
continue
if month is not None and visit_date.month != month:
continue
# Append the visit data to the list of visits
visit_data = [
visit['date'],
visit['temperature'],
visit['heart_rate'],
visit['respiratory_rate'],
visit['systolic_blood_pressure'],
visit['diastolic_blood_pressure'],
visit['oxygen_saturation']
]
visits.append((patient_id, visit_data))
# Sort the visits by date
visits.sort(key=lambda x: x[1][0])
return visits
def findPatientsWhoNeedFollowUp(患者):
# 根据生命体征异常寻找需要复诊的患者
followup_patients = set()
对于 patientID,访问 patients.items():
访问访问:
# 检查生命体征是否异常
如果 visit[1] > 38.0 或 visit[2] < 60 or visit[2] > 100 或 visit[3] < 12 or visit[3] > 20
或访问[4] < 90 or visit[4] > 140 或访问[5] < 60 or visit[5] > 90 或访问[6] < 95:
followup_patients.add(patientID)
break # only need to add patientID once if any visit is abnormal
return list(followup_patients)
def deleteAllVisitsOfPatient(患者、患者 ID、文件名): #删除特定患者的所有就诊 如果 patientId 在 patients 中: 患者[患者ID] = [] 打开(文件名,'w')作为文件: 对于 patients.values() 中的患者: 探访病人: file.write(f"{visit['patientID']},{visit['date']},{visit['temperature']},{visit['heart_rate']},{visit['respiratory_rate']} ,{visit['systolic_blood_pressure']},{visit['diastolic_blood_pressure']},{visit['oxygen_saturation']} ") print(f"患者 {patientId} 的数据已被删除。") 别的: 打印(f“没有找到ID为{patientId}的患者的数据。”)
定义主要(): patients = readPatientsFromFile('patients.txt') 而真实的: 打印(” 欢迎来到健康信息系统 ") print("1.显示所有患者数据") print("2.按ID显示患者数据") print("3.添加患者数据") print("4. 显示患者统计信息") print("5. 按年、月或两者查找访问") print("6.查找需要随访的患者") print("7. 删除特定患者的所有访问") print("8.退出 “)
choice = input("Enter your choice (1-8): ")
if choice == '1':
#diaplay the patient data
displayPatientData(patients)
elif choice == '2':
#display patient data for a given patient ID
patientID = int(input("Enter patient ID: "))
displayPatientData(patients, patientID)
elif choice == '3':
patientID = int(input("Enter patient ID: "))
date = input("Enter date (YYYY-MM-DD): ")
try:
temp = float(input("Enter temperature (Celsius): "))
hr = int(input("Enter heart rate (bpm): "))
rr = int(input("Enter respiratory rate (breaths per minute): "))
sbp = int(input("Enter systolic blood pressure (mmHg): "))
dbp = int(input("Enter diastolic blood pressure (mmHg): "))
spo2 = int(input("Enter oxygen saturation (%): "))
addPatientData(patients, patientID, date, temp, hr, rr, sbp, dbp, spo2, 'patients.txt')
except ValueError:
print("Invalid input. Please enter valid data.")
elif choice == '4':
patientID = input("Enter patient ID (or '0' for all patients): ")
displayStats(patients, patientID)
elif choice == '5':
year = input("Enter year (YYYY) (or 0 for all years): ")
month = input("Enter month (MM) (or 0 for all months): ")
visits = findVisitsByDate(patients, int(year) if year != '0' else None,
int(month) if month != '0' else None)
if visits:
for visit in visits:
print("Patient ID:", visit[0])
print(" Visit Date:", visit[1][0])
print(" Temperature:", "%.2f" % visit[1][1], "C")
print(" Heart Rate:", visit[1][2], "bpm")
print(" Respiratory Rate:", visit[1][3], "bpm")
print(" Systolic Blood Pressure:", visit[1][4], "mmHg")
print(" Diastolic Blood Pressure:", visit[1][5], "mmHg")
print(" Oxygen Saturation:", visit[1][6], "%")
else:
print("No visits found for the specified year/month.")
elif choice == '6':
followup_patients = findPatientsWhoNeedFollowUp(patients)
if followup_patients:
print("Patients who need follow-up visits:")
for patientId in followup_patients:
print(patientId)
else:
print("No patients found who need follow-up visits.")
elif choice == '7':
patientID = input("Enter patient ID: ")
deleteAllVisitsOfPatient(patients, int(patientID), "patients.txt")
elif choice == '8':
print("Goodbye!")
break
else:
print("Invalid choice. Please try again.\n")
if name == 'main': 主要()
我期待代码能正常运行,但我无法运行它,因为它说存在语法错误