第15章 Python的文件操作与数据库操作 课件(共148张PPT)2026年中职高考信息技术类总复习

资源下载
  1. 二一教育资源

第15章 Python的文件操作与数据库操作 课件(共148张PPT)2026年中职高考信息技术类总复习

资源简介

(共148张PPT)
第15章 Python的文件操作与数据库操作
知识与技能要点 考试条目 考试水平 (A/B/C/D) 复习建议
文件操作 1.文件的打开和关闭 B 本章内容在职教高考中文件操作要理解并能熟记常见的文件打开模式特点、文件的常用读操作函数、文件的写操作及文件的指针定位操作。认识数据格式,掌握CSV文件的常见读写操作方法。对于数据库操作,最好能结合案例记住各种典型应用常见的常用处理方法,不要过多去琢磨相关概
念,会用就行。
2.文件的读写 C 3.数据的格式化 D 数据库操作 1.Python数据库应用接口 B 2.sqlire2模块 C 3.数据表的创建 C 4.数据表的操作 C 1.文件的打开和关闭(B)
文件是存储在辅助存储器中的数据序列,Python通过文件操作实现对外部文件的使用。
考点1
文件操作
备考讲义
(1)文件的分类
①文本文件:
文本文件存储的是普通“字符”文本,Python 默认为 unicode 字符集(两个字节表示一个字符,最多可以表示65536 个),可以使用记事本程序打开。但是像 word 软件编辑的文档不是文本文件。
②二进制文件:
二进制文件把数据内容用“字节”进行存储,无法用记事本打开。必须使用专用的软件解码。常见的有MP4视频文件、MP3音频文件、JPG 图片、doc 文档等。
(2)文件打开与关闭
①文件的打开:
在Python中,使用open()函数,可以打开一个文件,返回一个文件对象。
命令格式:<对象名>=open(<文件名>[,<打开模式>])
注意,<文件名>必须包含扩展名,且可以包含文件路径。
最常见的访问模式:
“r”以只读模式打开文件,可以读取文件中的数据内容,不能修改文件中的数据内容。若文件不存在,则返回出错提示。文件的指针将会放在文件的开头。打开文件后,从文件的开头开始读取数据。不加访问模式参数,默认为只读。
“w”以只写模式打开文件,不能读取文件中的数据内容,可以将数据导入文件中。文件的指针也是在文件的开头,如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
“a”以追加模式打开文件。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
常见的打开模式如下。
表15—1 open()函数的打开模式
打开模式 描述 文件指针 异常
r 只读模式打开,默认 开头 如果文件不存在,会出现异常
r+ 读写模式打开,原文件内容保持不变 开头 如果文件不存在,会出现异常
w 只写模式打开,打开文件会清空原有内容 开头/结尾
打开模式 描述 文件指针 异常
w+ 读写模式打开,打开文件会清空原有内容 开头/结尾
a 追加模式打开 结尾
a+ 读写模式打开,文件原有内容保持不变;若文件不存在,则创建该文件 结尾
打开模式 描述 文件指针 异常
t 文本文件模式,可以与上述的混合使用,也是默认模式
b 二进制文件模式,可以与上述的混合使用
+ 附加参数,不能单独使用
注意:二进制文件和文本文件最大的区别是:如果我们没有增加模式“b”,则默认创建的是文本文件对象,处理的基本单元是“字符”。如果是二进制模式“b”,则创建的是二进制文件对象,处理的基本单元是“字节”。
②文件的关闭close():
命令格式:<文件对象名>.close()      
#关闭打开的文件对象
2.文件的读写操作(C)
Python使用内置函数对打开的文件进行读写操作
(1)文件的读取
①read()函数:
命令格式:<字符串变量名>=<文件对象名>.read([n])
功能:使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。读取整个文件,将文件内容放到一个字符串变量中,直接读取字节到字符串中,包括了换行符。缺点:如果文件非常大,尤其是大于内存时,无法使用read()方法。
f=open('file_b.txt','r') #读取
content=f.read(15) #读取文件前15个字节
content_all=f.read() #读取文件剩余所有字节
f.close()
注意:
如果open()打开一个文件用于读取内容,那么可以不用写打开的模式,即只写 open('file_b.txt');如果读了多次,那么后面读取的数据是从上次读完后的位置开始的。
②readline()
命令格式:<字符串变量名>=<文件对象名>.readline([n])
功能:readline()可以按照行的方式读取文件中的内容,会从文件的第一行开始读,多次读取就会依次向下读取,当没有内容时返回none。如果在readline()中传入一个数字n作为参数,那么会返回读取行的前n个字符。
③readlines()函数:
命令格式:<字符串变量名>=<文件对象名>.readlines([n])
功能:一次性读取整个文件,将整个文件数据内容按行读取到列表中,并且返回的是一个列表,其中每一行的数据为列表的一个元素。
(2)文件的定位
Python使用内置函数对一个打开的文件进行读写指针定位操作,用来确定文件读写操作的位置。文件读写指针初始值为0。
①(tell)()函数:
命令格式:[<变量名>=]<文件对象名>.tell()
功能:这个函数的返回值是当前文件指针的位置,返回的是从头开始到此时文件指针的位置所经历过的总字节数(偏移字节数)。
f=open(r“/user.txt”,'r+',encoding='utf8')
a=f.read()
print(a)
print(f.tell()) #测量文件指针偏移了多少个字节
②(seek)()函数:
命令格式:[<变量名>=]<文件对象名>.seek([,whence])
功能::文件指针移动的字符数。(可选):表示移动文件指针的参考位置,默认值为0。有三种取值:0表示从文件开头开始移动文件指针。1表示从当前位置开始移动文件指针,仅对二进制文件有效。2表示从文件末尾开始移动文件指针,仅对二进制文件有效。seek()函数可以将文件指针移动到指定的位置,实现快速定位和读取特定数据。通过指定参数为移动字符数,可以灵活地控制文件指针位置。
(3)文本文件的写入
①write()函数:
命令格式:<文件对象名>.write()
功能:<文件对象名>表示已经打开的文件对象;表示要写入文件的字符串(或字节串,仅适用于写入二进制文件中)。注意,采用不同的文件打开模式,会直接影响 write() 函数向文件中写入数据的效果。另外,在写入文件完成后,一定要调用 close() 函数将打开的文件关闭,否则写入的内容不会保存到文件中。
②writelines() 函数:
命令格式:<文件对象名>.writelines()
功能:<文件对象名>表示已经打开的文件对象;表示要写入文件的字符串。
需要注意的是,使用 writelines() 函数向文件中写入多行数据时,不会自动给各行添加换行符。
3.数据的格式化(D)
数据通常存储在文件之中,为了方便后续的读写操作,数据通常需要按照约定的组织方式进行存储。
(1)一维数据
一维数据呈线性排列,一般用特殊字符分隔,具体示例如下。
a.使用空格分隔:成都 杭州 重庆 武汉 苏州 西安 天津
b.使用逗号分隔:成都,杭州,重庆,武汉,苏州,西安,天津
c.使用&分隔:成都&杭州&重庆&武汉&苏州&西安&天津
如上所示,在存储一维数据时可使用不同的特殊字符分隔数据元素,但有几点需要注意。
①同一文件或同组文件一般使用同一分隔符分隔。
②分隔数据的分隔符不应出现在数据中。
③分隔符为英文半角符号,一般不使用中文符号作为分隔符。
(2)二维数据
二维数据可视为多条一维数据的集合。国际上通用的二维数据存储格式为CSV(commae-separeted values,逗号分隔值),CSV文件以纯文本形式存储表格数据,文件的每一行对应表格中的一条数据记录,每条记录由一个或多个字段组成,字段之间使用逗号(英文、半角)分隔。因为字段之间可能使用除逗号外的其他分隔符,所以CSV也称为字符分隔值,具体示例如下。
姓名,语文,数学,英语,理综
刘婧,124,137,145,260
张华,116,143,139,263
邢昭林,120,130,148,255
特点:读取出的数据一般为字符类型,如果是数字需要人为转换为字符;以行为单位读取数据;列之间以半角逗号或制表符为分隔,一般半角逗号;一般为每行开头不空格,第一行是属性列,数据列之间以间隔符为间隔无空格,行之间无空行。
(3)csv模块
Python内置的csv模块提供了读取和写入CSV文件的类reader和wite。
①读取CSV文件:
命令格式:<对象名>=csv.reader(<文件对象名>)
功能:返回一个reader对象,该对象将逐行遍历文件。
具体步骤如下:
导入csv库。
打开CSV文件。
创建一个csv.reader对象。
逐行读取CSV文件。
关闭CSV文件。
以下是一个示例代码,演示了如何读取一个CSV文件。
import csv
with open('products.csv','r') as csv_file:
  csv_reader=csv.reader(csv_file)
  for row in csv_reader:
     print(row)
在这个示例中,我们首先使用open()函数打开了一个名为products.csv的CSV文件,并用读取模式打开它。接下来,我们使用csv.reader()函数创建了一个CSV阅读器对象,并将其分配给变量csv_reader。我们使用了一个for循环,逐行读取CSV文件中的内容,并将每行作为一个列表打印出来。
②写入CSV文件:
命令格式:<对象名>=csv.writer(<文件对象名>)
功能:定义一个write对象。
命令格式:writerow(<一维列表>)
功能:在CSV文件中写入单行。
命令格式:writerows(<二维列表>)
功能:在CSV文件中写入多行。
具体步骤如下:
导入csv库。
打开CSV文件。
创建一个csv.writer对象。
写入CSV文件。
关闭CSV文件。
以下是一个示例代码,演示了如何将Python列表写入CSV文件中。
import csv
products=[
  ['Product Name','Price'],
  ['Apple',1.25],
  ['Banana',0.95],
  ['Orange',1.50]
]
with open('products.csv','w',newline='') as csv_file:
  csv_writer=csv.writer(csv_file)
  for product in products:
    csv_writer.writerow(product)
在这个示例中,我们首先定义了一个列表products,其中包含了商品名称和价格的信息。接下来,我们使用open()函数打开了一个名为products.csv的CSV文件,并用写入模式打开它。我们使用csv.writer()函数创建了一个CSV写入器对象,并将其分配给变量csv_writer。我们使用了一个for循环,逐个将列表products中的每个子列表写入CSV文件中。
例1 写出以只读方式打开文件“test1.txt”的操作,并测试其打开方式的命令。
【试题分析】 本题主要考查学生对文件打开方式的理解与记忆,注意文件的打开方式是打开文件的mode属性。
【解析】 open()文件的默认方式就是只读模式,打开后可以用mode属性测试。
答案:
file1=open(“test1.txt”)
Print(file1.mode)
例2 写出以只写方式打开文件“test1.txt”的操作,并测试其文件长度的命令。
【试题分析】 本题主要考查学生对文件打开方式的理解与记忆,注意只写方式将清空原文件数据,因此测试其文件长度知,长度为0。
【解析】 根据以上分析可知以上操作,注意测试文件长度getsize()函数是os标准库函数,因此先要导入os库。
答案:
import os
file2=open(“test1.txt”,“w”)
n=os.path.getsize(“test1.txt”)
Print(n)
例3 写出从键盘输入文件名,若存在则以读写模式打开文件,若不存在则创建该文件的命令。
【试题分析】 本题主要考查学生对文件常见几个属性的理解与掌握程度。测试文件是否存在要用isfile()函数。
【解析】 根据以上分析可知以上操作,注意测试文件长度isfile()函数是os标准库函数,因此先要导入os库,再打开文件时,文件的扩展名不能少。
答案:
import os
fname=input(“请输入要打开的文件名:”)
fname=fname+“txt”
yn=os.path.isfile(fname)
if yn:
  f=open(fname,“r+”)
  print(“打开文件:”,f.name)
else:
  f=open(fname,“x”)
  print(“创建文件:”,f.name)
变式训练1
(1)从键盘输入文件名与打开模式,打开该文件,并输出文件名和文件打开方式的命令。
程序如下:
fname=input(“请输入要打开的文件名:”)
fname=fname+“txt”
fmode=input(“请输入该文件的打开模式:”)
f=open(fname,fmode)
print(“打开的文件是:”+f.name)
print(“打开的模式是:”+f.mode)
【试题分析】 本题考查学生对文件打开方式的理解与记忆,打开后对象的文件名是name属性,打开方式是mode属性。
【解析】 根据以上分析可知以上操作,注意文件打开操作时扩展名不能少。
(2)写出以追加方式打开文件“test1.txt”并保持原文件内容不变的操作,并测试其文件长度的命令。
import os
file3=open(“test1.txt”,“a+”)
n=os.path.getsize(“test1.txt”)
print(n)
【试题分析】 本题考查学生对文件打开方式的理解与记忆,注意追加方式“a”和“a+”的区别,“a”只写模式打开、“a+”读写模式打开,文件原有内容保持不变;若文件不存在,则创建该文件。
【解析】 根据以上分析可知以上操作,注意调用测试函数getsize()之前先要导入os标准库。
例4 编程实现把“test1.txt”中的所有内容添加到“test2.txt”的末尾。
【试题分析】 本题主要考查文件的打开与读写操作,把test1内容添加到test2文件的末尾,test1只读打开,test2需以“a+”方式打开。分别打开后,先用read()函数读出打开的test1的内容,再用write()函数写入打开的test2,最后分别关闭打开的两个对象。
【解析】 根据以上分析,可知以下操作。
答案:
file1=open(“test1.txt”,“r”)
file2=open(“test2.txt”,“a+”)
content=file1.read()
file2.write(content)
file1.colse()
file2.close()
例5 编程实现把“sc1.txt”文件中的内容逐行加入到“sc2.txt”文件的开头。
【试题分析】 本题主要考查文件的打开与读写操作,注意readline()和readlines(),write()和writelines()的区别。readline()是读出当前行的所有字符,readlines()是读出文件的所有内容,返回值是由若干行字符串组成的列表。write()是将字符串写入对象,writelines()是将行字符串列表写入对象。
【解析】 根据以上分析,可知先用“r”和“r+”模式分别打开sc1和sc2,再用readlines()方法把sc1文件内容全部读入列表,接着用循环遍历内容列表,逐行把内容写入sc2,最后分别关闭打开的对象。
答案:
f1=open(“sc1.txt”,“r”)
f2=open(“sc2.txt”,“r+”)
lines=f1.readlines()
for line in lines:
  f2.write(line)
f1.close()
f2.close()
例6 编程实现统计文件“test1.txt”的字符数。
【试题分析】 本题主要考查文件的读写操作和定位操作,注意文件打开时文件指针的位置。默认只读方式时,文件指针在文件头。要统计字符数用循环遍历,每次后移一个字符,再读出下个符号,若不为空,就记一次数,位置再后移一位,若为空则已经到文件尾就退出。输出结果并关闭文件。
【解析】 根据以上分析,可写出以下程序。
答案:
i=0;s=0
file1=open(“test1.txt”)
while Ture:
  file.seek(i)
  a=file1.read(1)
  if a:
    s+=1
    i+=1
  else:
    break
    print(s)
file1.close()
变式训练2
(1)编程实现把文件cs1.txt中的每行字符前加上序号1、2、3…后写入另一个文件cs2.txt中。
f1=open(“cs.txt”)
lines=f1.readlines()
f1.colse()
for i in range(len(lines)):
  lines[i]=str(i+1)+lines[i]
f2=open(“cs2.txt”,“a+”)
f2.writelines(lines)
f2.close()
【试题分析】 本题主要考查文件的读写操作,注意read()、readline()和readlines()的区别及write()和writelines()的区别。
【解析】 先只读打开文件,用readlines()把文件的所有内容读入由若干行字符串组成的列表,再循环遍历列表,给每行字符串加上序号。接着再用追加方式打开要写入的文件,用writelines()写入行列表,最后关闭文件对象。
(2)编程实现创建文件text1.txt,并从键盘直接输入该文件的内容。
f1=open(“text1.txt”,“x+”)
while True:
  b=input(“请输入数据内容”)
  b1.write(b)
  d=input(“是否继续输入(Y|N)”)
  if d.lower()==“n”:
    break
f1.close()
【试题分析】 本题主要考查文件的读写操作,注意程序控制方式。
【解析】 先用“x+”方式打开文件,再用循环控制(当用户不再继续输入时用break退出循环),每次循环时先接受内容,再用write()写入内容,退出循环后关闭文件对象。
(3)编程实现打开要比较的两个文件(text1.txt和text2.txt),如果文件内容完全相同,则输出“ok”,否则输出“no”。
f1=open(“text1.txt”)
f2=open(“text2.txt”)
content1=f1.read()
content2=f2.read()
if content1==content2:
  print(“ok”)
else:
  print(“no”)
【试题分析】 本题主要考查文件的读写操作,注意程序控制方法。
【解析】 先分别只读打开文件对象,再用read()分别读出文件的所有内容,最后根据比较结果,给出反馈。
例7 视频文件属于________(文本/二进制)文件。
【答案】 二进制
【试题分析】 本题主要考查学生对数据文件类型的理解与掌握,文本文件是基于特定编码的字符构成,二进制文件是由二进制数据0和1构成,没有统一的字符编码,一般由特定的应用程序创建。
【解析】 根据以上分析,可知是二进制文件。故填二进制。
例8 CSV文件是以________为分隔符的结构化文本文件。
【答案】 逗号(英文、半角)
【试题分析】 本题主要考查学生对CSV文件概念的理解。二维数据以结构化的文本文件形式保存,其中csv是将数据列用逗号分隔的常用数据交换形式。
【解析】 根据以上分析可知答案。故填逗号(英文、半角)。
例9 编程创建一个cs1.csv文件,输入表中的数据,并输出文件的内容。
【试题分析】 本题主要考查学生对CSV文件的常用读写操作。导入csv库,先打开CSV文件,接着定义一个CSV文件的write对象,再用writerow()和writerows()方法分别写入表头和数据行,最后用reader()方法读出写入的所有数据,输出后关闭文件。
【解析】 根据以上分析,可写成以下程序。
答案:
import csv
f=open(“cs1.csv”,“w+”)
w=csv.write(f)
bt=[“学号”,“姓名”,“语文”,“数学”,“英语”]
sj=[[“0001”,“张三”,“78”,“85”,“74”],
  [“0002”,“李四”,“88”,“75”,“69”]]
w.writerow(bt)
w.writerows(sj)
seek(0)
r=csv.reader(f)
print(list(r))
f.close()
变式训练3 编程实现打开cs2.csv文件,逐行输出文件内容。
f1=open(“cs2.csv”)
while True:
  line=f1.readline()
  if line:
    print(line,end=“”)
  else:
    break
f1.close()
【试题分析】 本题主要考查文件的常用读写操作。先打开文件,再用永真循环处理,每次循环时先用readline()读出当前行数据,若当前行有数据就输出数据,若没有就break退出,最后关闭程序。
【解析】 根据以上分析,可以得到以上答案。
1.Python数据库应用接口(B)
2.Sqlite3模块
sqlite是Python连接数据库的内置模块,我们不需要安装任何服务器端或客户端软件,也不需要让某个东西作为服务运行,只要用Python导入库并开始编码,就会有一个关系数据库管理系统,十分的便捷。
考点2
数据库的使用
备考讲义
(1)sqlite库介绍
①sqlite3常用数据类型
sqlite3 采用动态数据类型,会根据存入的值自动判断其数据类型。值的数据类型由值本身决定,而非存储容器。而传统的关系数据库采用静态数据类型,即数据类型在数据表声明时已确定。因此我们即使在数据表声明时明确了字段类型,也可以在该字段中存储其他类型的数据。
sqlite3 中常见数据类型:
表15—2 sqlite3支持的数据类型
数据类型 描述
INTEGER 整数
REAL 浮点数
TEXT 文本字符串(UTF-8编码等)
NULL 空值
BLOB 数据块(二进制数据)
需要特别说明的是,尽管 sqlite3 为我们提供了这种方便,但是考虑到数据库平台的可移植性,我们在实际的开发过程中应尽可能地保证数据类型存储和声明的一致性。
其他数据类型如下:
布尔类型:sqlite并没有提供专门的布尔存储类型,而是用整型1表示 true,0表示 false。
日期和时间数据类型:和布尔类型一样,sqlite没有提供专门的日期时间存储类型,而是以 TEXT、REAL 和 INTEGER 类型分别表示该类型,其中:
TEXT 类型表示“YYYY-MM-DD HH:MM:SS.SSS”格式的日期;
REAL 类型表示以公元 4714 年 11 月 24 日格林尼治时间的正午开始算起的天数;
INTEGER 类型表示以 UNIX 时间形式保存的数据值,即从 1970-01-01 00:00:00 到当前时间所流经的秒数。
②sqlite常用方法:
我们借助 sqlite3 库在 Python 中操作sqlite数据库,sqlite3 库的API接口如表所示。
表15—3 sqlite3库的API接口
API 描述
sqlite3.connect (database) 该 API 打开一个到数据库的连接。可以使用memory来在 RAM 中打开一个到 database 的数据库连接,而不是在磁盘上打开。如果数据库成功打开,则返回一个连接对象。如果给定的数据库名称 filename 不存在,则该 API 将创建一个数据库。我们如果不想在当前目录下创建数据库,可以指定带有路径的文件名,这样就可以在任意目录下创建数据库了
API 描述
connection.cursor ([cursorClass]) 创建一个游标(cursor),该方法接受一个单一的可选的参数 cursorClass,该参数必须是一个扩展自 sqlite3.Cursor 的自定义游标类参数
cursor.execute (sql[,optional parameters]) 执行一个 SQL 语句,该 SQL 语句可以被参数化
API 描述
cursor.executemany (sql,seq_of_ parameters) 用于执行相同的SQL命令多次,每次使用来自序列的不同参数。使用executemany()函数,可以在一次数据库交互中执行多次插入、更新或删除操作,这通常比重复执行execute()函数更有效
connection. commit() 该方法用于提交当前的事务。如果未调用该方
法,那么自上一次调用 commit() 方法以来所做的任何动作对其他数据库连接是不可见的
API 描述
cursor.close() 该方法用于关闭游标
connection.close() 该方法用于关闭数据库连接。注意,该方法不会自动调用 commit() 方法。如果之前未调用 commit() 方法,调用该方法时将直接关闭数据库连接,所做的所有更改也将全部丢失
API 描述
cursor.fetchone() 该方法用于获取查询结果集中的下一行,返回一个单一的序列,当没有更多可用的数据时,返回 None
cursor.fetchmany ([size=cursor.arraysize]) 该方法用于获取查询结果集中的下一组,返回一个列表。当没有更多的可用的行时,返回一个空的列表。该方法尝试获取由 size 参数指定的行
cursor.fetchall() 该方法用于获取查询结果集中所有(剩余)的行,返回一个列表。当没有可用的行时,返回一个空的列表
(2)使用sqlite操作数据库
sqlite3 库的使用包括导入sqlite3库、连接数据库、创建游标对象、执行 SQL 语句和关闭连接5步,它访问数据库的一般步骤为:导入相关模块;连接数据库并获取数据连接对象;获取游标对象;应用游标对象的方法进行数据库相关操作;关闭游标对象;关闭数据连接。
①数据库的连接与关闭:
a.连接数据库connect()函数
命令格式:<对象名>=sqlite3.connect('数据库文件名')
功能:connect()函数用于建立与sqlite数据库的连接。该函数接受一个数据库文件名作为参数,并返回一个连接对象,该对象可用于执行SQL命令和操作数据库。如果指定的数据库文件不存在,connect()函数将创建一个新的数据库文件。
b.关闭数据库close()函数
命令格式:<数据库连接对象名>.close()
功能:close()函数用于关闭数据库连接。一旦完成了与数据库的交互,使用close()函数是一个推荐的做法,因为它可以释放资源并确保连接被正确关闭。
import sqlite3 # 导入数据库
conn=sqlite3.connect('test.db') # 连接到数据库文件
conn.close() # 关闭数据库连接
②游标对象:
游标是数据库管理系统中的一个非常重要的概念,它代表了当前数据所在的位置。当我们需要查询或修改数据库中的数据 时,都需要使用游标来访问和定位数据。具体而言,游标可以看作是指向当前查询数据中某个位置的指针,我们可以通过移动游标的位置实现数据的访问和操作。在Python中,我们可以使用DB-API定义的游标对象对数据库进行操作。在使用游标之 前,我们需要先通过连接对象对数据库进行连接。接下来,我们创建游标对象并将其赋值给一个变量,以进行数据的访问和操作。
a.创建游标
import sqlite3 # 导入数据库
conn=sqlite3.connect('example.db') # 连接到数据库
c=conn.cursor() # 创建游标
b.游标的用途
游标在Python中的使用非常广泛,它可以用于以下几个方面。
(a)数据查询
当我们需要从数据库中查询数据时,可以使用游标来实现。具体而言,我们可以通过游标的execute()方法向数据库发送SQL语句,并使用fetchall()、fetchone()等方法获取查询结果。
c.execute('SELECT * FROM students') # 查询数据
result=c.fetchall() # 获取查询结果
print(result)
(b)数据修改
当我们需要修改数据库中的数据时,可以使用游标来实现。具体而言,我们可以通过游标的execute()方法向数据库发送SQL语句,并使用commit()方法提交修改。
c.execute('UPDATE students SET age=20 WHERE name=“Tom”') # 修改数据
conn.commit() # 提交修改
c.游标的操作
在使用游标时,我们可以对其进行多种操作。下面介绍一些常见的游标操作。
(a)移动游标
我们可以使用游标的fetchone()、fetchmany()、fetchall()等方法移动游标的位置。
c.execute('SELECT * FROM students') # 移动游标
result1=c.fetchone() # 移动一条记录
print(result1)
result2=c.fetchmany(2) # 移动两条记录
print(result2)
result3=c.fetchall() # 移动所有记录
print(result3)
(b)获取查询结果数
我们可以使用游标的rowcount属性获取查询结果的行数。
c.execute('SELECT * FROM students') # 获取查询结果数
print(c.rowcount)
(c)获取字段名和类型
我们可以使用游标的description属性获取查询结果的字段名和类型。
c.execute('SELECT * FROM students') # 获取字段名和类型
print(c.description)
d.游标的注意事项
在使用游标时,需要注意以下事项。
(a)游标需要关闭
在使用完游标后,需要及时关闭游标,以释放资源。
c.close() # 关闭游标
(b)数据库连接需要释放
在使用完数据库后,需要及时释放数据库连接,以避免资源的浪费。
conn.close() # 释放数据库连接
③execute()函数:
execute()函数是游标对象(Cursor)的一个方法,用于执行SQL命令。使用execute()函数,可以执行各种SQL命令,比如SELECT、INSERT、UPDATE、DELETE等。注意:execute()函数只是执行SQL命令,并不会自动提交更改。
import sqlite3 # 导入数据库
conn=sqlite3.connect('test.db') # 连接到数据库文件
cursor=conn.cursor() # 创建游标对象
cursor.execute('CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY,name TEXT)')
# 执行SQL命令
cursor.close() # 关闭游标
conn.close() # 关闭数据库连接
④commit()函数:
commit()函数是数据库连接对象(Connection)的一个方法,用于提交事务。在sqlite中,事务是一组数据库操作,要么全部成功执行,要么全部回滚(撤销)。当我们在sqlite中执行多个操作时,可以使用事务来确保数据的一致性。使用commit()函数,可以提交之前执行的所有数据库操作。一旦调用了commit()函数,所有未提交的更改都会被保存到数据库中。如果在调用commit()函数之前发生了错误,可以选择回滚事务以撤销所有更改。
import sqlite3 # 导入数据库
conn=sqlite3.connect('test.db') # 连接到数据库文件
cursor=conn.cursor() # 创建游标对象
# 执行一些数据库操作
cursor.execute('CREATE TABLE IF NOT EXISTS users
(id INTEGER PRIMARY KEY,name TEXT)')
cursor.execute(“INSERT INTO users (name) VALUES ('Jack')”)
cursor.execute(“INSERT INTO users (name) VALUES ('Tom')”)
conn.commit() # 提交更改
cursor.close() # 关闭游标
conn.close() # 关闭数据库连接
⑤fetchall()函数:
fetchall()函数是游标对象(Cursor)的一个方法,用于获取查询结果集中的所有行。使用该函数,可以一次性获取查询结果集中的所有行,并以列表的形式返回。每行数据表示为一个元组或列表,其中包含了该行的各个列的值。注意:如果查询结果集非常大,使用fetchall()函数可能会消耗较多的内存。在这种情况下,可以考虑使用 fetchone()或fetchmany()函数来分批获取查询的结果。
import sqlite3 # 导入数据库
conn=sqlite3.connect('test.db') # 连接到数据库文件
cursor=conn.cursor() # 创建游标对象
cursor.execute('SELECT * FROM users') # 执行查询
rows=cursor.fetchall() # 获取查询结果集中的所有行
for row in rows:
  print(row) # 输出查询结果
cursor.close() # 关闭游标
conn.close() # 关闭数据库连接
⑥fetchone()函数:
fetchone()函数是游标对象(Cursor)的一个方法,用于获取查询结果集中的下一行。使用该函数,可以逐行获取查询结果集中的数据。每次调用fetchone()函数,它会返回结果集中的下一行数据。当没有更多的行可用时,它将返回None。
import sqlite3 # 导入数据库
conn=sqlite3.connect('test.db') # 连接到数据库文件
cursor=conn.cursor() # 创建游标对象
cursor.execute('SELECT * FROM users')
# 执行查询
row=cursor.fetchone() # 获取查询结果集中的下一行数据
while row:
  print(row) # 输出查询结果
  row=cursor.fetchone()
cursor.close() # 关闭游标
conn.close() # 关闭数据库连接
⑦fetchmany()函数:
fetchmany(size)函数是游标对象(Cursor)的一个方法,用于获取查询结果集中的多行数据,最多获取size行。注意:每次调用 fetchmany()函数都会从上次获取数据的地方开始继续获取,也就是说,如果先调用了fetchmany(5),然后再调用 fetchmany(5),那么第二次调用将返回查询结果的第6-10行。如果想要重新从头开始获取数据,需要先调用 cursor.scroll(0,mode='absolute') 来重置游标位置。
import sqlite3 # 导入数据库
conn=sqlite3.connect('test.db') # 连接到数据库文件
cursor=conn.cursor() # 创建游标对象
cursor.execute('SELECT * FROM users') # 执行查询
rows=cursor.fetchmany(5) # 最多获取5行数据
for row in rows:
  print(row) # 输出查询结果
cursor.close() # 关闭游标
conn.close() # 关闭数据库连接
3.数据表的创建(B)
(1)连接数据库
conn=sqlite3.connect('example.db') # 连接数据库
(2)创建表格
conn=sqlite3.connect('example.db') # 连接数据库
c=conn.cursor() # 获取游标
c.execute('''CREATE语句 ''') # 创建表格
conn.commit() # 提交更改
cursor.close() # 关闭游标
conn.close() # 关闭连接
(3)插入数据
conn=sqlite3.connect('example.db') # 连接数据库
c=conn.cursor() # 获取游标
c.execute(“INSERT语句”) # 插入数据
conn.commit() # 提交更改
cursor.close() # 关闭游标
conn.close() # 关闭连接
(4)查询数据
conn=sqlite3.connect('example.db') # 连接数据库
c=conn.cursor() # 获取游标
c.execute(“SELECT语句”) # 查询数据
result=c.fetchall() # 抓取查询结果
print(result) # 输出查询结果
conn.commit() # 提交更改
cursor.close() # 关闭游标
conn.close() # 关闭连接
(5)更新数据
conn=sqlite3.connect('example.db') # 连接数据库
c=conn.cursor() # 获取游标
c.execute(“UPDATE语句”) # 更新数据
conn.commit() # 提交更改
cursor.close() # 关闭游标
conn.close() # 关闭连接
(6)删除数据
conn=sqlite3.connect('example.db') # 连接数据库
c=conn.cursor() # 获取游标
c.execute(“DELETE语句”) # 删除数据
conn.commit() # 提交更改
cursor.close() # 关闭游标
conn.close() # 关闭连接
4.数据表的操作(C)
在SQL中,数据表是用于存储数据的结构化对象,它由一系列的行和列组成。
数据表的操作语句有以下类型。
表15—4 数据表的操作语句
操作类型 操作语句 描述
数据定义 CREATE 创建数据库表
ALTER 修改数据表结构
DROP 删除数据库表
数据操纵 INSERT 添加数据记录
UPDATE 更新数据记录
DELETE 删除数据记录
数据查询 SELECT 查询满足条件的数据记录
(1)创建表与修改表结构
①创建表:
CREATE TABLE语句用于创建一个新的数据表,它的基本语法如下。
CREATE TABLE table_name (
  column1 datatype [PRIMARY KEY]>[,
  column2 datatype [PRIMARY KEY]>[,
  column3 datatype [PRIMARY KEY]>[,
  ……])
CREATE TABLE:这是SQL关键字,表示要创建一个新的数据表。
table_name:是个人给数据表起的名称。名称应该简明扼要,能够清楚地表示表的内容。
column1,column2,column3:是数据表的列名,表示属性名。
datatype:是指定每个列的数据类型。
添加约束:约束用于限制数据表中的数据,以确保数据的完整性和准确性。
常见的约束有:
PRIMARY KEY:为主键值,用于设置主键,表示该列数据不允许有重复值。
NOT NULL:用于限制列的值不能为空。
②修改表结构:
通用格式:ALTER TABLE 表名 ACTION(更改选项)
a.添加新的列
要添加新的列到已有的数据表中,我们可以使用ALTER TABLE语句,并使用ADD关键字来指定新的列名和数据类型。
ALTER TABLE employees ADD email VARCHAR(100)
#在“employees”的数据表加一个新的列“email”来存储员工的电子邮件地址
b.删除列
如果我们想要删除数据表中的某一列,可以使用ALTER TABLE语句,并使用DROP COLUMN关键字来指定要删除的列名。
ALTER TABLE products DROP COLUMN category
#在“products”的数据中删除“category”列
c.删除数据表
删除数据表是数据库管理中的一个重要操作,但同时也需要谨慎对待,因为一旦数据表被删除,其中的数据将会永久丢失。
命令格式:DROP TABLE 表名;
DROP TABLE kong #删除了数据表kong
(2)数据操作
①添加数据:
命令格式:INSERT INTO 表名(field1,field2,…fieldN)
VALUES (value1,value2,…valueN)
a.标准添加(指定所有字段,给定所有的值)
insert into student(id,name,age,sex,adress,tel)
values(1,'张三',20,'男','天上','110')
b.指定部分字段添加
如果字段约束允许传入空值,那么插入数据时此类字段可以不进行添加。
insert into student(name,age,sex,adress) values('王二麻子','32','女','月球')
②修改数据:
a.更新表中所有行
UPDATE 表名 SET 字段1=值1,字段2=值2,字段n=值n…
b.添加过滤条件表示更新表中特定行
UPDATE 表名 SET 字段1=值1,字段2=值2,……WHERE 条件
update stu set age=35,sex='m' where id=11 #将id为11的age改为35,sex改为m值
③删除数据:
如果要删除数据库表中的记录,我们可以使用DELETE语句。
DELETE语句的基本语法是:DELETE FROM<数据表名>[WHERE<条件>];
注意到DELETE语句的WHERE条件也是用来筛选需要删除的行,因此和UPDATE类似,DELETE语句也可以一次删除多条记录。
(3)数据查询
使用SELECT语句可以从数据表中检索数据。
①基础查询:
查询表中所有数据命令格式:
SELECT * from 数据表名
查询部分列或单个列命令格式:
SELECT 字段1,字段2,…from 数据表名
②条件查询:
可以在 WHERE 子句中指定任何条件,可以使用 AND 或者 OR 指定一个或多个条件。
select * from class where class_name='Python03' #查询班级表中Python03的学生信息
select * from stu where age=12 and sex='男' #查询age为12的男生信息
select * from stu where id>5 #查询id号值在5以上的学生信息
select * from stu where age>=20 and age<=25 #查询年龄在20至25岁的学生信息
select * from stu where age between 20 and 25;
③排序查询:
SELECT * from表名 ORDER BY 字段名 排序规则
使用ORDER BY子句来设定你想按哪个字段哪种方式来进行排序,返回排序后的查询结果。
可以设定多个字段来排序,也可以使用 ASC(升序) 或 DESC(降序)关键字来设置排序规则,默认情况下,是按升序排列。
select * from stu order by age #默认asc升序 可省略
select * from stu order by age asc #年龄升序排序
select * from stu order by age desc #年龄降序排序
select * from stu order by classid asc,age desc #查询学生信息,按班级做升序排序,相同班级按年龄降序排序
④分组查询
GROUP BY 语句根据一个或多个列对结果进行分组,在分组的列上我们可以使用 COUNT(),SUM(),AVG(),等函数。
select sex,count(*) from stu group by sex #统计班级信息,按性别分组,并统计每组人数
select classid,count(*) from stu group by classid #统计每个班级的人数
select classid,sex,count(*) from stu group by classid,sex #统计每个班级的,男生和女生各多少人数
⑤查询中使用聚合函数
max(属性名) #函数返回属性最大值
min(属性名) #函数返回属性最小值
count() #函数返回在给定的选择中被选的行数
sum(属性名) #函数返回数值型属性的和
avg(属性名) #函数返回数值型属性的平均值
select max(age),min(age),avg(age) from stu #获取学生表中最大、最小以及平均年龄是多少
select count(id) from users #统计当前表中有多少条数据
select count(*) from users where sex='1' #获取学生表中男生m的数量
例10 编程实现在student库中建立一个学生月考成绩(ykcj)表,录入数据,并输出录入的数据的命令。
【试题分析】 本题主要考查sqlite3创建数据库,并对数据库插入记录的操作。要求学生掌握并能熟练应用操作连接数据库、创建游标、定义表、生成表、插入表记录,最后关闭游标、关闭数据库。
【解析】 根据以上分析,先连接数据库、接着创建游标、CREATE创建表、再用游标commit()执行生成表,接着用INSERT语句向表中插入记录,最后关闭游标、关闭数据库连接,完成任务。
答案:
import sqlite3
con=sqlite3.connect(“student.db”)
con_cur=con.cursor()
s1=“CREATE TABLE ykcj(学号 TEXT,姓名 TEXT,语文 REAL,数学 REAL,英语 REAL)”
con_cur.execute(s1)
mit()
sj=[(“0001”,“张三”,78,84,62),\\
(“0002”,“李四”,67,74,82),\\
(“0003”,“王二”,85,56,62),\\
]
s2=“insert into ykcj values( , , , , )”
con_cur.execute(s2,sj)
mit()
con_cur.close()
con.close()
例11 编程实现打开xxgl数据库,在teacher表中查询统计男女教师人数,并输出查询结果的命令。
【试题分析】 本题主要考查sqlite3对数据库的查询操作。要求学生掌握并能熟练应用操作连接数据库、创建游标、定义SELE语句并执行,最后关闭游标、关闭数据库。
【解析】 根据以上分析,先连接数据库、接着创建游标、定义SELE查询语句、再用游标commit()执行,接着用游标的fetchall方法抓取查询结果,最后关闭游标、关闭数据库连接,完成任务。
答案:
import sqlite3
con=sqlite3.connect(“xxgl.db”)
con_cur=con.cursor()
s1=“SELE 性别 count(*)from teacher group by 性别”
con_cur.execute(s1)
sj=con_cur.fetchall()
print(sj)
mit()
con_cur.close()
con.close()
例12 编程实现的命令打开xxgl数据库,在xsyk表中对所有人的语文成绩+2分,保存并输出所有学生的姓名和语文成绩。
【试题分析】 本题主要考查sqlite3对数据库的更新操作。要求学生掌握并能熟练应用操作连接数据库、创建游标、定义UPDATE语句并执行,最后关闭游标、关闭数据库。
【解析】 根据以上分析,先连接数据库、接着创建游标、定义UPDATE语句、再用游标commit方法执行,接着用游标的fetchall方法抓取更新结果,最后关闭游标、关闭数据库连接,完成任务。
答案:
import sqlite3
con=sqlite3.connect(“xxgl.db”)
con_cur=con.cursor()
s1=“UPDATE ykcj SET 语文=语文+2”
con_cur.execute(s1)
sj=con_cur.fetchall()
print(sj)
mit()
con_cur.close()
con.close()
变式训练4
(1)编程实现新建一个gsgl.db数据库,并创建zggz表的命令。
import sqlite3
con=sqlite3.connect("gsgl.db")
con_cur=con.cursor()
s1="CREATE TABLE zggz(职工号 TEXT,姓名 TEXT,基本工资 REAL,奖金 REAL)"
con_cur.execute(s1)
mit()
con_cur.close()
con.close()
【试题分析】 本题主要考查sqlite3创建数据库的操作。要求学生掌握并能熟练应用操作连接数据库、创建游标、定义表、生成表、最后关闭游标、关闭数据库。
【解析】 根据以上分析,先连接数据库、接着创建游标、CREATE创建表、再用游标commit()执行生成表,最后关闭游标、关闭数据库连接,完成任务。
(2)编程实现打开gsgl.db数据库,在zggz表中查询男、女职工的平均工资,并输出结果的命令。
import sqlite3
con=sqlite3.connect("gsgl.db")
con_cur=con.cursor()
s1=" SELE 性别 count(*)from zggz group by 性别"
con_cur.execute(s1)
sj=con_cur.fetchall()
print(sj)
mit()
con_cur.close()
con.close()
【试题分析】 本题主要考查sqlite3对数据库的查询操作。要求学生掌握并能熟练应用操作连接数据库、创建游标、定义SELE分组查询语句并执行,最后关闭游标、关闭数据库。
【解析】 根据以上分析,先连接数据库、接着创建游标、定义SELE查询语句、再用游标commit()方法执行,接着用游标的fetchall方法抓取查询结果,最后关闭游标、关闭数据库连接,完成任务。
(3)编程实现打开gsgl.db数据库,在zg表中输入要查询的职工姓名,输出该职工的数据记录的命令。
import sqlite3
con=sqlite3.connect("gsgl.db")
con_cur=con.cursor()
name=input("请输入要查询的职工姓名")
s1=" SELE * from zg where 姓名=name"
con_cur.execute(s1)
sj=con_cur.fetchone()
print(sj)
mit()
con_cur.close()
con.close()
【试题分析】 本题主要考查sqlite3对数据库的查询操作。要求学生掌握并能熟练应用操作连接数据库、创建游标、定义SELE条件查询语句并执行,最后关闭游标、关闭数据库。
【解析】 根据以上分析,先连接数据库、接着创建游标、定义SELE查询语句、再用游标commit()方法执行,接着用游标的fetchone方法抓取查询结果,最后关闭游标、关闭数据库连接,完成任务。
例13 查询student表中所有姓王的男生记录。
【试题分析】 本题主要考查学生对条件查询的掌握情况,尤其是like子句如何使用。
【解析】 根据以上分析,写SELECT语句时注意like子句的表达方式。
答案:sele * from student where 姓名 like“王%”
例14 查询ykcj表中各班语文、数学、英语的平均分。
【试题分析】 本题主要考查学生对分组查询和聚合函数的掌握情况,能熟练准确使用GROUP BY 子句与聚合函数。
【解析】 根据以上分析,先用班级进行分组,再注意使用AVG()函数求平均值。
答案:select 班级,avg(语文),avg(数学),avg(英语) from ykcj group by 班级
例15 在student表中添加一个备注字段。
【试题分析】 本题主要考查学生对ALTER语句修改表结构的掌握情况。
【解析】 根据以上分析,学会准确套用ALTER语句完成对表结构的修改操作。
答案:ALTER TABLE student ADD 备注 TEXT
例16 在student表中查询各班团员人数。
【试题分析】 本题主要考查学生对分组查询和聚合函数的掌握情况,能熟练准确使用GROUP BY 子句、聚合函数及逻辑型字段的条件表达。
【解析】 根据以上分析,先用班级进行分组,再注意使用count(*)求满足条件的分组记录数。
答案:select 班级 count(*) from student where 团员group by 班级
变式训练5
(1)在zg表中查询各部门的职工人数。
select 部门 count(*) from zg group by 部门
【试题分析】 本题主要考查学生对分组查询和聚合函数的掌握情况,能熟练准确使用GROUP BY 子句与聚合函数。
【解析】 根据以上分析,先用部门进行分组,再注意使用count(*)求分组记录数。
(2)在zggz表中查询工资+奖金大于等于10000的职工工资记录。
select * from zggz where 工资+奖金>=10000
【试题分析】 本题主要考查学生对条件查询的掌握情况,注意工资+奖金大于等于10000的条件表达。
【解析】 根据以上分析,写SELE语句时注意使用where子句准确表达相关条件。
一、单项选择题
1.关于文件,下列说法中错误的是(   )
A.对已经关闭的文件进行读写操作会默认再次打开文件
B.对文件操作完成后即使不关闭程序也不会报错,所以可以不关闭文件
C.对于非空文本文件,read()函数返回字符串,readlines()函数返回列表
D.file=open(filename,“rb”)表示以只读、二进制方式打开名为filename的文件
A
2.关于CSV文件处理,下述描述中错误的是(   )
A.因为CSV文件以半角逗号分割每列数据,所以即使数据为空也要保留逗号
B.对于包含英文半角逗号的数据,以CSV文件保存时需要进行转码处理
C.因为CSV文件可以由EXCEL打开,所以是二进制文件
D.通常CSV文件每行表示一个一维数据,多行表示二维数据
C
3.采用Python语言对CSV文件写入,最可能采用的字符串方法
是(   )
A.strip() B.split()
C.join() D.format()
C
4.sqlite3是Python连接数据库的内置模块,支持________数据库
系统。 (   )
A.关系 B.层次
C.网状 D.网络
A
5.fetchmany()函数结果的数据类型是(   )
A.集合 B.元组
C.列表 D.字典
C
二、编程题
6.输入一个文件和一个字符,统计该字符在文件中出现的次数。请根据要求写出合适的代码。
解:
filename=input('请输入文件名或者文件地址:') #先通过IPUT获得目标文件和需要查找的文字
wordname=input('请输入一个要查找的字符:')
file=open(filename,'r') #读取文件
sumword=" #设置字符拼接变量
for line in file: #利用FOR循环读取文件内的内容并进行拼接保存的变量中
  data=line.strip('\\n')
  sumword +=data
if wordname in sumword: #以IF和ELSE判断来对目标字符查找
  print(sumword.count(wordname))
else:
  print('你输入的字符不在文件中')
file.close() #关闭文件
7.假设有一个英文文本文件,编写一个程序读取其内容并将里面的大写字母转小写字母,小写字母转大写字母。请根据要求写出合适的代码。
解:
f_in=open("input.txt","r") #打开文本文件,读取其内容
content=f_in.read()
for c in content: #遍历文本文件中的每个字符,判断其是否是大小写字母;如果是大写则转小写,小写则转大写
  if c.isupper():
    c.lower()
  elif c.islower():
    c.upper()
f_out=open("output.txt","w") #创建一个新的文本文件,将转化后的字符写入新文件中
f_out.write(c)
8.创建一个CSV文件,并写入十行数据。请根据要求写出合适的代码。
解:
import csv #导入所需模块
import random
filename="data.csv" #创建一个CSV文件,并定义文件名和列名。可以使用csv.writer方法来创建一个新的CSV文件,并指定文件名和列名
columns=["Name","Age","Gender"]
file1=open(filename,”w”)
writer=csv.writer(file1)
writer.writerow(columns)
num_rows=10 #生成一些数据来写入CSV文件。假设我们要生成10条数据,每条数据包括姓名、年龄和性别
data=[]
fori in range(num_rows):
  name="John Doe"
  age=random.randint(18, 100)
  gender=random.choice(["Male","Female"])
  data.append([name, age, gender])
file2=open(filename,”a”)
writer=csv.writer(file)
writer.writerows(data)
9.编程实现下列功能:创建一个班级数据库,按语文、数学、英语科目建立数据表,用于保存各科成绩。
解:
import sqlite3
db=open("banji.db","a+")
db_con=sqlite3.connect("banji.db")
db_cur=db_con.cursor()
s1="create table xs_yw(学号 TEXT,姓名 TEXT,语文 REAL)"
db_cur.execute(s1)
s2="create table xs_sx(学号 TEXT,姓名 TEXT,数学 REAL)"
db_cur.execute(s2)
s3="create table xs_yy(学号 TEXT,姓名 TEXT,英语 REAL)"
db_cur.execute(s3)
db_cur.close()
db_con.close()
10.编程完成职工数据库职工工资表的数据统计:统计每名职工的实发工资(实发工资=岗位工资+绩效工资+奖金-应扣额)命令。
解:
import sqlite3
db_con=sqlite3.connect("zg.db")
db_cur=db_con.cursor()
s1="update zggzb set 实发工资=岗位工资+绩效工资+奖金-应扣额"
db_cur.execute(s1)
s2="select 工号,姓名,实发工资 from zggzb"
db_cur.execute(s2)
jg=db_cur.fetchall()
print(jg)
db_cur.close()
db_con.close()

展开更多......

收起↑

资源预览