结合sqlite3的学生信息成绩管理系统(六):导入数据文件import_data.py

该博客介绍了如何使用Python的sqlite3模块创建一个学生信息成绩管理系统,重点在于import_data.py脚本,用于导入数据文件。脚本包括导入全部信息和单独导入科目成绩的功能,模拟了SQL Server的数据导入方式。在导入时,系统会根据xls文件的表头与数据库字段对应,如果文件中有新学生信息,系统会检查学号和姓名是否存在。同时,提供了各个关键函数的简要说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、系列文章链接

(一):程序介绍和流程图
(二):主要文件main.py
(三):基础文件basics.py
(四):管理学生信息manage.py
(五):查询学生信息query.py
(六):导入数据文件import_data.py
(七):导出数据文件export_data.py

二、实现效果

(1)导入全部信息

表格中的数据

先导入数据,表格中的数据如下:
学生表
课程表
选课表

简单模仿了SQL Server的导入

导入全部信息,系统会遍历整个xls文件,左边的是文件中的表头,是文件自带的,不管文件中的是什么,只要我们找出数据库中和它对应的即可联系上,如左边是“学号”“学生的学号”,只要导入填的是“Sno”或“学号”就能成功。
课程表和选课表也是相同原理,全部导入完毕提示成功。
在这里插入图片描述

(2)导入科目成绩

表格中的数据

可以在导入全部信息后再分开导入科目成绩。
创建了一个语文成绩表,选取了导入全部信息中导入的三个已经存在的学生,加上三个新学生(当初新学生用了舍友的学号和名字,打了马赛克)
在这里插入图片描述

导入时的注意事项

如果课程不存在,将会提示是否创建。
文件中一定要有学生的学号和姓名,不然新学生无法被创建,因为学生表的学号和姓名是一定不能为空的。如果只有学生的学号的话,那么得确保文件中的学生之前已经在数据库中。
在这里插入图片描述

三、import_data.py的函数简介

def main( cn):
“”“调用import_all,import_one函数”""
def main_show():
“”“主函数的显示”""

def insert_students( cn, sno, sname):
“”“对学生表进行插入,区别与ba里的,这里不用自动插入Sclass”""

(1)导入全部信息

  1. def import_all( cn):
    “”“导入全部信息,调用all_的函数”""
    #all的导入简单模仿了SQL Server的导入,需要自己输入导入到哪个表中,不然会出错

  2. def all_students( cn, table):
    “”“导入全部信息到 学生表 中”""

  3. def all_courses( cn, table):
    “”“导入全部信息到 课程表 中”""

  4. def all_reports( cn, table):
    “”“导入全部信息到 成绩表 中”""

(2)从header获取相应的信息,导入到三个表的操作

  1. def import_students( cn, table, header):
    “”“新的文件信息导入到 学生表 “””

  2. def import_courses( cn, table, header):
    “”“新的文件信息导入到 课程表 “””

  3. def import_reports( cn, table, header, nead):
    “”“新的文件信息导入到 成绩表 “””

    #nead是课程号,选课学年,选课学期是否需要输入
    #如果nead中没有相应的key值,就需要从header中获取
    #即不需要我们输入,在表格中本就存在

(3)导入单科成绩

  • def import_one( cn):
    “”“导入科目成绩”""

四、代码

import os
import xlrd
import basics as ba

def insert_students( cn, sno, sname):
    """对学生表进行插入,区别与ba里的,这里不用自动插入Sclass"""
    sql = '''insert into Students (Sno, Sname)
            values('%s','%s')
         ''' % ( sno, sname)
    cn.execute( sql)
    cn.commit()

#从header获取相应的信息,导入到三个表的操作
def import_students( cn, table, header):
    """新的文件信息导入到学生表"""
    stu = [ 'Sgender','Sbirth','Sclass','Snative']
    nrows = table.nrows #表的行数
    for i in range( 1, nrows):
        onerow = table.row_values(i)
        sno = onerow[ header['Sno']]
        sno = str(int(sno))
        sname = onerow[header['Sname']]

        sql = "SELECT DISTINCT Sname FROM Students " \
              "WHERE Sno = '%s'" % sno
        cursor = cn.execute( sql)
        information = 0
        for row in cursor:
            information = row[0]
        if information != 0:
            if information != onerow[header['Sname']]:
                print("数据库中的已经存在这个学号,"
                      "对应的姓名为'%s',"
                      "而导入文件中的姓名为'%s'" %
                      (information, onerow[header['Sname']]))
                confirm = input("信息冲突,是否覆盖?"
                                "(包括学生表和成绩表)(Y/N)")
                if confirm == 'y' or confirm == 'Y':
                    ba.del_students( cn, sno)
                    insert_students( cn, sno, sname)
                else:
                    print("取消覆盖,这行略过")
                    continue
        else:
            insert_students( cn, sno, sname)

        for key, value in header.items():
            if key in stu:
                if key == 'Sbirth':
                    x = xlrd.xldate_as_tuple( onerow[ value], 0)
                    day = x[0:3]
                    onerow[ value] = str(day
Traceback (most recent call last): File "/home/blw/anaconda3/envs/myenv/lib/python3.11/site-packages/osgeo/__init__.py", line 30, in swig_import_helper return importlib.import_module(mname) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/blw/anaconda3/envs/myenv/lib/python3.11/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen importlib._bootstrap>", line 1204, in _gcd_import File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 676, in _load_unlocked File "<frozen importlib._bootstrap>", line 573, in module_from_spec File "<frozen importlib._bootstrap_external>", line 1233, in create_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed ImportError: /home/blw/anaconda3/envs/myenv/lib/python3.11/site-packages/osgeo/../../../libgdal.so.36: undefined symbol: sqlite3_total_changes64 During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/data2/blw/code/RGB_TAKE.py", line 6, in <module> from osgeo import gdal File "/home/blw/anaconda3/envs/myenv/lib/python3.11/site-packages/osgeo/__init__.py", line 35, in <module> _gdal = swig_import_helper() ^^^^^^^^^^^^^^^^^^^^ File "/home/blw/anaconda3/envs/myenv/lib/python3.11/site-packages/osgeo/__init__.py", line 32, in swig_import_helper return importlib.import_module(&#39;_gdal&#39;) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/blw/anaconda3/envs/myenv/lib/python3.11/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ModuleNotFoundError: No module named &#39;_gdal&#39;在我的虚拟环境中出现了这个问题
最新发布
03-16
<think>嗯,用户遇到了Python虚拟环境中osgeo.gdal模块加载失败的问题,报错是ModuleNotFoundError或者ImportError,特别是提到sqlite3_total_changes64。我需要帮他们解决这个问题。首先,我得分析可能的原因。 首先,用户可能是在虚拟环境中安装GDAL的方式不对。GDAL作为地理数据处理库,安装起来有时候比较麻烦,尤其是在Windows上。常见的问题包括依赖项缺失或者版本不兼容。用户提到使用了Anaconda,可能他们尝试了conda install,但可能没有指定正确的频道或者版本。 然后,错误信息中提到了sqlite3_total_changes64,这可能是SQLite版本的问题。Python 3.11默认使用的SQLite版本可能与GDAL模块需要的版本不兼容。需要检查系统中安装的SQLite版本,或者Python是否链接了正确的SQLite库。 接下来,我需要考虑解决方案。首先建议使用conda安装,因为conda可以处理二进制依赖,可能会更顺利。如果不行,可能需要从第三方源下载预编译的whl文件,比如Gohlke的库,但要注意Python版本和系统架构是否匹配。另外,确保虚拟环境正确激活,并且安装时没有权限问题。 另外,用户可能混合使用了pip和conda,这有时会导致依赖冲突。应该建议他们创建一个干净的虚拟环境,优先使用conda安装GDAL,或者全部使用pip,但要注意来源的兼容性。 还需要检查Python版本是否为3.11,因为某些第三方包可能尚未支持最新版本,这时候可能需要降级Python3.10或更早的版本,或者寻找兼容的GDAL版本。 最后,如果所有方法都失败,可能需要手动编译GDAL,但这对于普通用户来说比较复杂,所以作为最后的选择。或者建议使用Docker容器来避免环境配置的问题。</think>### 分步解决方案:Python虚拟环境中osgeo.gdal模块加载失败问题 #### 1. 确认环境隔离状态 - 使用以下命令检查当前虚拟环境路径: ```bash python -c "import sys; print(sys.executable)" ``` 确保输出路径包含虚拟环境目录(如`venv`或`.venv`),而非Anaconda基础环境路径[^1] #### 2. 优先尝试Conda安装方案 ```bash conda install -c conda-forge gdal=3.6.3 ``` * 特别说明:强制指定`conda-forge`频道可避免依赖冲突 * 版本建议:Python 3.11建议搭配GDAL 3.6.x系列 #### 3. 解决SQLite3兼容性问题 ```bash conda install -c conda-forge sqlite=3.37.0 ``` * 关键作用:修复`sqlite3_total_changes64`符号缺失错误 * 验证命令: ```python import sqlite3 print(sqlite3.sqlite_version) # 应显示 >=3.37.0 ``` #### 4. 备选方案:Windows预编译包 从Unofficial Windows Binaries下载对应版本: ```bash pip install https://download.lfd.uci.edu/pythonlibs/archived/GDAL-3.6.3-cp311-cp311-win_amd64.whl ``` * 注意点: - 必须匹配Python版本(cp311=Python3.11) - 系统架构需对应(win32/amd64) - 需要预先安装Microsoft Visual C++ Redistributable #### 5. 环境变量配置验证 ```bash python -c "from osgeo import gdal; print(gdal.__version__)" ``` * 预期输出:显示GDAL版本号(如3060300) * 异常处理:若提示DLL加载失败,需手动添加PATH: ```python import os os.environ[&#39;PATH&#39;] = r&#39;C:\path\to\gdal\bin;&#39; + os.environ[&#39;PATH&#39;] ``` #### 6. 终极解决方案:Docker容器化 ```dockerfile FROM continuumio/miniconda3 RUN conda install -c conda-forge gdal=3.6.3 python=3.11 ``` * 优势:完全隔离系统环境依赖 * 执行命令: ```bash docker build -t gdal-env . docker run -it gdal-env python -c "from osgeo import gdal" ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值