文件读写
- 1.基本操作
- 1.1文件的打开和关闭
- 1.1.1 打开文件 open()函数
- 1.1.2 关闭文件
- 2.txt文件读写
- 2.1 文件读取
- 2.1.1 `f.read(size=-1)`
- 2.1.2 `f.readline()`
- 2.1.3 `f.readlines(hint=-1)`
- 2.1.4 for循环遍历
- 2.2 文件写入
- 2.2.1 `f.write(string)`
- 2.2.2 `f.writelines(sequence)`
- 2.3 指针随机读写
- 3.csv文件读写
- 3.1 普通读写
- 3.1.1`csv.reader(csvfile, dialect=’excel’, **fmtparams)`
- 3.1.2 `csv.writer(csvfile, dialect=’excel’, **fmtparams)`
- 3.2 以字典形式读写
- 3.2.1 DictReader类
- 3.2.2 DictWriter类
- 3.3 Reader对象的方法和属性
- 3.4 Writer对象的方法和属性
- 4.xls与xlsx文件读写
- 4.1 xlrd模块
- 4.1.1 打开文件
- 4.1.2 获取工作表
- 4.1.3 获取工作表的行数和列数
- 4.1.4 获取整行和整列的值
- 4.1.5 获取特定单元格的值
- 4.2 xlwt模块
- 4.2.1 创建工作簿
- 4.2.2 单元格格式设置
- 5.json文件读写
- 5.1 json.dump()方法
- 5.2 json.dumps()方法
- 5.3 json.load()方法
- 5.4 json.loads()方法
- 5.5 json.JSONDecoder()函数
- 5.6 json.JSONEncoder()函数
- 6.sql文件读写
- 6.1 连接数据库
- 6.2 创建操作
- 6.3 插入操作
- 6.4 查询操作
- 6.5 修改操作
- 删除操作
1.基本操作
1.1文件的打开和关闭
通常使用python的内建函数open()
函数来打开文件,使用with语句或者文件对象的close()
方法来关闭文件。
1.1.1 打开文件 open()函数
open(file, mode=’r’, buffering=1, encoding=None, errors=None, newline=None,
closefd=True, opener=None)[ ]
对于一般文件,设置前两个参数就够用了。
-
file
参数是一个路径,表示要打开的文件的路径 -
mode
表示文件的打开方式,默认r,只读模式 -
buffering
参数是一个可选的整数,用于设置缓冲策略。若取0则切换缓冲(仅允许在二进制模式下),取1则选择行缓冲(仅在文本模式下可用),若取>1的整数则指定以字节为单位的块缓冲区的大小。如果没有给出buffering参数,则默认二进制文件以固定大小的块进行缓冲,通常为4076或8172字节,且文本文件使用行缓冲。 -
encoding
参数指定用于解码或编码文件的编码,仅在文本模式下使用。默认编码是依赖平台的,可通过locale.getpreferredencoding()获知,encoding参数可取任何Python支持的文本编码,常用编码包括’ascii’、’gbk’、’utf-8’等。 -
errors
参数是一个可选的字符串,用于指定如何处理编码和解码错误,跟encoding参数一样仅在文本模式下使用。encoding参数可取任何codecs.register_error()中注册过的标准错误处理名称。 newline
参数仅适用于文本模式,用于指定读写操作时采用的换行模式。
- 在读取模式下,如果newline为None,则启用通用换行模式,文件中的以’\n’、’\r’或’\r\n’结尾的行均被翻译为’\n’;如果newline是空值,则行结尾不进行翻译,直接返回;如果newline是任何其他合法值,则行由给定字符串终止,并将行结尾返回调用者。
- 在写入模式下,如果newline为None,则写入的任何’\n’字符都将转换为系统默认行分隔符;如果newline是’’或’\n’,则不进行翻译;如果newline是任何其他合法值,则写入的任何’\n’字符将被转换为给定的字符串。
- closefd参数是一个可选的布尔值,默认为True。如果closefd是False且给出的是文件描述符而不是文件名,则当文件关闭时,底层文件描述符将保持打开状态。如果给出的是文件名则closefd必须为True,否则将引发错误。
- opener参数用于使用自定义开启器,通过使用参数file和flags能获得文件对象的基础文件描述符。
1.1.2 关闭文件
关闭文件的含义是将文件对象与外存上的文件脱离联系,释放打开文件时占用的资源。
- with关键字
with open('workfile.txt','r') as f
read_date = f.read() #文件操作代码块
缩进内部都是with的作用范围,缩进部分结束后,python会自动关闭文件
- closed()方法
f.closed()
2.txt文件读写
2.1 文件读取
2.1.1 f.read(size=-1)
f.read(size=-1)
:从文件中读取size指定的字符数并将其作为字符串(文本模式下)或字节对象(二进制模式下)返回。size是一个可选的数字参数,如果未给定size或size为负数,则读取并返回文件的全部内容。如果已到达文件末尾,f.read()将返回一个空字符串“”。
2.1.2 f.readline()
f.readline()
:从文件中读取一行内容,返回的字符串末尾为换行符’\n’,如果文件不以换行符结尾,则在文件的最后一行省略。空行用’\n’表示,该字符串只包含一个换行符。如果已到达文件末尾,f.readline()将返回一个空字符串。
2.1.3 f.readlines(hint=-1)
f.readlines(hint=-1)
从文件中读取hint指定的行数,如果未给定hint或hint为负数,则读取所有行内容,并返回以每行内容为元素形成的一个列表。
2.1.4 for循环遍历
for line in f:
print(line, end=’’)
通过循环遍历文件对象来读取文件中的行
2.2 文件写入
2.2.1 f.write(string)
f.write(string)
:向文件中写入string字符串,并返回写入的字符数,且不会自动在字符串末尾添加‘\n’换行字符。
2.2.2 f.writelines(sequence)
f.writelines(sequence)
:向文件中写入sequence字符串列表,不会自动在字符串末尾添加‘\n’换行字符。
2.3 指针随机读写
在对文件进行读写操作时,文件对象的位置指针指向当前读写的位置,顺序读写一个字符后,该位置指针自动移动指向下一个字符。
f.seek(offset,startpoint=0)
- startpoint参数可缺省,默认值为0,即从文件开始进行读写,1表示当前位置,2表示从末尾计算。
- offset偏移量指以startpoint为基点,往后移动的字节数。
f.tell()
- 返回当前的指针位置
3.csv文件读写
首先import csv
,没有可以pip安装
3.1 普通读写
3.1.1csv.reader(csvfile, dialect=’excel’, **fmtparams)
该函数用于从csv文件中读取数据,返回一个在给定的csvfile中的行上迭代的reader对象。
- csvfile是文件对象或列表对象,如果csv是文件对象,则应该使用newline=’’打开它;
- dialect是一个可选参数,用于指定csv文件的格式,包括一系列特定参数的取值,可以是Dialect类的子类实例或者由list_dialect()函数返回的字符串,默认值是excel,即以逗号为分隔符;
- 其他可选的fmtparams关键字参数用于指定当前dialect状态下特定的格式参数,可以覆盖dialect中的格式。
eg:
import csv
with open('eggs.csv', newline='') as csvfile: #使用with语句保证文件关闭
spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|') #构造reader对象
for row in spamreader: #循环遍历每行数据
print(','.join(row)) #以逗号为分隔符输出数据
3.1.2 csv.writer(csvfile, dialect=’excel’, **fmtparams)
writer函数用于向csv文件写入数据,返回一个writer对象,负责将用户的数据在给定的文件类对象上转换为带分隔符的字符串。
- csvfile可以是具有write()方法的任何对象。如果csvfile是文件对象,则应使用newline=’’打开它。
- dialect参数可选,用于定义特定于当前csv dialect的一组参数,它可以是方言类的子类的实例,也可以是list_dialogens()函数返回的字符串之一,默认值是excel,即以逗号为分隔符。
- 其他可选的fmtparams关键字参数可用于覆盖当前dialect中的单个格式参数。
writer对象的writerow方法能够写入一行数据,writerrows方法写入多行数据。
import csv
with open('eggs.csv', 'w', newline='') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',quotechar='|',quoting=csv.QUOTE_MINIMAL) #构造writer对象
spamwriter.writerow(['Spam'] * 5 + ['Baked Beans']) #写入行
spamwriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
3.2 以字典形式读写
3.2.1 DictReader类
csv.DictReader(f, fieldnames=None, restkey=None, restval=None, dialect='excel', *args, **kwds)
上述语句创建一个DictReader对象,将每行中的信息映射到一个ordereddict上。该ordereddict对象的键由可选的fieldname参数给定。
- fieldnames参数是一个序列,如果省略了该参数,则文件f第一行中的值将用作字段名。
- 如果一行中的字段多于字段名,则剩余数据将放入列表中,并使用restkey指定的字段名存储(默认为无)。
- 如果非空行的字段少于字段名,则缺少的值将用’None’填充。不管字段名是如何确定的,有序字典都会保留其原始顺序。所有其他可选参数或关键字参数都将传递给基础reader实例。
import csv
with open('names.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile) #构造DictReader对象
for row in reader: #循环遍历reader中的行
print(row['first_name'], row['last_name']) #输出名和姓
3.2.2 DictWriter类
csv.DictWriter(f, fieldnames, restval='', extrasaction='raise', dialect='excel', *args, **kwds)
- FieldNames参数是一个键序列,用于标识传递给writeRow()方法的字典中的值写入文件f的顺序。
- restval参数可选,用于指定当字典在FieldNames中缺少键时要写入的值。
- 如果传递给writerow()方法的字典包含在字段名中找不到的键,则可选的extrasaction参数指示要采取的操作。如果将其设置为“raise”,则会引发默认值ValueError;如果设置为“ignore”,则忽略字典中的额外值。
- 任何其他可选参数或关键字参数都将传递给基础writer实例。
- 注意,与DictReader类不同,DictWriter类的fieldname参数不是可选的。
import csv
with open('names.csv', 'w', newline='') as csvfile:
fieldnames = ['first_name', 'last_name'] #定义键序列
writer = csv.DictWriter(csvfile, fieldnames=fieldnames) #构造DictWriter对象
writer.writeheader() #写入构造函数指定的字段名
writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'}) #写入行
writer.writerow({'first_name': 'Lovely', 'last_name': 'Spam'})
writer.writerow({'first_name': 'Wonderful', 'last_name': 'Spam'})
3.3 Reader对象的方法和属性
csv模块提供了对于Reader对象的方法和属性,可用于DictReader实例和由reader()函数返回的对象。
- Reader对象的通用方法:
-
csvreader.__next__()
:将可迭代的Reader对象的下一行内容作为列表(如果对象由read()函数返回)
或字典(如果对象是一个DictReader实例)返回。
- Reader对象的共有属性:
-
csvreader.dialect
:解析器正在使用的dialect的只读描述。 -
csvreader.line_num
:从源迭代器中读取的行数,与返回的记录数不同,因为记录可以跨多行。
- DictReader对象独有的共有属性:
-
DictReader.fieldnames
:如果在创建对象时未作为参数传递,则在第一次访问或从文件中读取第一条记录时初始化此属性。
3.4 Writer对象的方法和属性
csv模块提供了对于Writer对象的方法和属性,可用于DictWriter实例和由writer()函数返回的对象。对于Writer对象,行必须是可迭代的字符串或数字,对于DictWriter对象,行必须是将字段名映射为字符串或数字的字典(首先通过str()传递)。
- Writer对象的通用方法:
-
csvwriter.writerow(row)
:将row参数写入Writer的文件对象,并根据当前dialect进行格式化。 -
csvwriter.writerows(rows)
:将rows中的所有元素(一个可迭代的行对象)写入Writer的文件对象,
并根据当前dialect进行格式化。
- Writer对象的共有属性:
-
csvwriter.dialect
:当前Writer对象正在使用的dialect的只读描述。
- DictWriter对象独有的通用方法:
-
DictWriter.writeheader()
:写入一行在构造函数中指定的字段名。
4.xls与xlsx文件读写
- xls是2003及以前版本生成的文件格式,是一个特有的二进制格式,其核心结构是复合文档类型的结构,
- xlsx是2007及以后版本生成的文件格式,且2007之后版本可以打开xls格式的文件,核心结构是XML类型的结构,采用的是基于XML的压缩方式,使其占用的空间更小。
通常可以使用xlrd模块与xlwt模块实现对excel文件内容读取和写入。
4.1 xlrd模块
xlrd模块实现内容读取import xlrd
4.1.1 打开文件
打开example文件并获取所有sheet的名称
文件打开:xlrd.open_workbook(r'path')
获取所有表单的名称:表.sheet_names()
import xlrd
data = xlrd.open_workbook(r'F:\example.xlsx')
sheet_name = data.sheet_names() #获取所有sheet的名称
print(sheet_name)
4.1.2 获取工作表
- 使用
sheets()[index]
函数通过索引获取表单,其中,index表示表单的索引; - 通过
sheet_by_index(num)
函数的方式获取表单,其中,num表示表单的索引。
-通过sheet_by_name(name)
函数的方式获取表单,其中,name表示表单的名称。
#通过sheet页的索引获取sheet表
workbook1 = data.sheets()[0]
print(workbook1)
#另一种索引方式
workbook1 = data.sheet_by_index(1)
print(workbook1)
#通过sheet页的名字获取sheet表
workbook1 = data.sheet_by_name('STUDENT')
print(workbook1)
4.1.3 获取工作表的行数和列数
- 获取行数:工作表
.nrows
- 获取列数:工作表
.ncols
num_rows = workbook1.nrows
print("STUNDT工作表行数为:",num_rows)
num_cols = workbook1.ncols
print("STUNDT工作表列数为:",num_cols)
4.1.4 获取整行和整列的值
row_values()
函数和col_values()
函数分别被用于获取表单中整行和整列的表单内容,括号中可以填写数值,表示获取第几行或第几列的内容。
first_row = workbook1.row_values(0)
print(first_row)
first_col = workbook1.col_values(0)
print(first_col)
使用上述方法再结合前面获取的行数或者列数,加上for循环就可以遍历获取表的全部值
4.1.5 获取特定单元格的值
cell(row, col).value
,其中row的值表示所在行,col的值表示所在列;cell_value(row, col)
获取指定行列的单元格的值row()[].value
,小括号填写行数,中括号写列数
print('第1 行1列内容:', workbook1.cell(0,0).value) # 第1 行1列内容
print('第2 行1列内容:',workbook1.cell_value(1,0)) # 第2 行1列内容
print('第3 行2列内容:',workbook1.row(2)[1].value) # 第3 行2列内容
4.2 xlwt模块
xlwt模块实现内容写入
4.2.1 创建工作簿
xlwt模块中可以使用xlwt.Workbook()
创建工作簿,之后通过add_sheet()
函数在创建的工作簿中添加新的表单,使用write()
函数将需要输入的内容写入表单中,使用形式为:sheet1.write(row,col,label = 'str’)
sheet1为表单的名称,row可以指定单元格的行,col指定单元格的列,label指定需要输入的内
容。
import xlwt
workbook = xlwt.Workbook(encoding = 'utf-8') #创建第一个sheet
sheet1 = workbook.add_sheet('sheet1',cell_overwrite_ok=True)
sheet1.write(0,0,label = 'just a test') #参数对应行,列,值
workbook.save('E:\example1.xls') #表格存储文件夹路径
save()
函数用于指定工作簿的保存路径
4.2.2 单元格格式设置
font = xlwt.Font()
为样式创建字体
设置如下,更多设置可以查看官方文档
import xlwt
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = 'Times New Roman'
font.bold = True # 黑体
font.underline = True # 下划线
font.italic = True # 斜体字
style.font = font # 设定样式
sheet1.write(0, 0, 'Unformatted value') # 不带样式的写入
sheet1.write(1, 0, 'Formatted value', style) # 带样式的写入
workbook.save('E:\example1.xls') # 保存文件
sheet1.col(0).width = 3333 # 设置单元格宽度
sheet1.col(0).height = 3333 # 设置单元格高度
workbook.save('E:\example1.xls') # 保存文件
5.json文件读写
JSON是JavaScript对象的字符串表示法,使用文本表示一个JavaScript对象的信息,本质是一个字符串。JSON键值对是用来保存JS对象的一种方式,键值对组合中的键名写在前面并使用双引号,使用冒号分隔,然后是值,例如:{"firstName": "Json"}
,等价于以下JavaScript语句:{firstName : "Json"}
。
Python的json模块能够实现Python对象和JSON格式之间的互相转换,即序列化和反序列化。使用json模块需要使用import json语句导入该模块。json模块的dump方法和dumps方法将Python对象序列化(编码)为JSON格式字符串,load方法和loads方法将JSON格式反序列化(解码)为Python对象。另外,json模块还提供了编码器类JSONDecoder和解码器类JSONEncoder,支持自定义的编码和解
码操作。
5.1 json.dump()方法
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True,cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
-
obj
: 表示是要序列化的对象。 -
fp
: 文件描述符,将序列化的str保存到文件中。json模块总是生成str对象,而不是字节对象;因此,fp.write()必须支持str输入。 -
skipkeys
: 默认为False,如果skipkeysTrue,(默认值:False),则将跳过不是基本类型(str,int,float,bool,None)的dict键,不会引发TypeError。 -
ensure_ascii
: 默认值为True,能将所有传入的非ASCII字符转义输出。如果ensure_ascii为False,则这些字符将按原样输出。 -
check_circular
:默认值为True,如果check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError。 -
allow_nan
: 默认值为True,如果allow_nan为False,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError。 如果allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)。indent: 设置缩进格式,默认值为None,选择的是最紧凑的表示。 -
Indent
:如果indent是一个非负整数或者字符串,那么JSON数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 “”,则只会添加换行符。None(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果indent是一个字符串(比如"\t"),会被用于缩进每一层。 -
separators
:参数应当是一个 (item_separator, key_separator) 元组,用于指定键值之间的分隔符。当 indent 为 None 时,默认值取 (’, ', ': ‘)。 -
default
: 默认值为None,如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError。 -
sort_keys
: 默认值为False,如果sort_keys为True,则字典的输出将按键值排序。
该方法能够将obj序列化为一个JSON格式的流并输出到一个支持.write()
方法的文件类对象fp。由于json 模块始终产生 str 对象而非 bytes 对象,fp.write() 必须支持字符串输入。
5.2 json.dumps()方法
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True,cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
参数含义同上
该方法能够将obj序列化成JSON格式的字符串并返回
5.3 json.load()方法
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None,parse_constant=None, object_pairs_hook=None, **kw)
- 如果指定了
parse_float
,它会被调用于每个要被解码的JSON浮点数的字符串。默认情况下,这相当于函数float(num_str)
。这可以用于为JSON浮点数使用另一个数据类型或解析器,例如decimal.decimal
。 - 如果指定了
parse_int
,它会被调用于每个要解码的JSON整数的字符串。默认情况下,这相当于函数int(num_str)
。这可用于为JSON整数使用另一个数据类型或解析器,例如float。 - 如果指定了
parse_constant
,它会被调用于以下字符串之一:“-Infinity”、“Infinity”、“NaN”。如果遇到无效的JSON数字,可以使用此方法来引发异常。 - 通过
cls
关键字参数来指定使用自定义JSONDecoder子类,否则将使用JSONDecoder。其他关键字参数将传递给类的构造函数。 -
object_hook
是一个可选的函数,它会被调用于每一个解码出的对象字面量,即一个字典dict。 object_hook 的返回值会取代原本的 dict,能够被用于实现自定义解码器。 -
object_pairs_hook
是一个可选的函数,它会被调用于任何解码出的按顺序排列的对列表对象。将使用该函数的返回值而不是dict,能够用于实现自定义解码器。如果还定义了object_hook
,则object_pairs_hook
优先。
该方法将一个支持 .read()
方法并包含一个JSON文档的文本文件或者二进制文件的fp反序列化为一个Python对象。如果要反序列化的数据不是有效的JSON文档,则会引发JSONDecoderError。
5.4 json.loads()方法
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
该方法将s反序列化为Python对象,s可为一个包含JSON文档的字符串、字节对象或字节数组。
参数含义与load()相同
通俗的说就是让json的字符串变成python可读,易读的类型
import json
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]') #反序列化
5.5 json.JSONDecoder()函数
json.JSONDecoder(*, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, strict=True, object_pairs_hook=None)
这是一个简单的JSON解码器的构造函数。默认情况下,依照以下规则进行解码,见表。
JSON数据类型 | Python数据类型 |
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
- 如果strict参数为False(默认为True),则字符串中允许使用控制字符。控制字符是字符代码在0-31范围内的字符,包括’\t’、’\n’、’\r’和’\0’。其他参数含义与load()内相同,
- 如果要反序列化的数据不是有效的JSON文档,则会引发JSONDecoderError。
5.6 json.JSONEncoder()函数
json.JSONEncoder(*, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, sort_keys=False, indent=None, separators=None, default=None)
这是一个简单的JSON编码器的构造函数。参数含义与dump()内相同
编码规则见上表
6.sql文件读写
由于MySQL服务器以独立的进程运行,并通过网络对外服务,所以,需要支持Python的MySQL驱动来连接到MySQL服务器。可以通过Python包管理工具pip进行安装,使用命令pip3 install PyMySQL
为测试是否成功安装PyMySQL,可以创建一个python文件,代码为:import pymysql
若执行代码后运行未出现任何错误,则表示安装成功。
6.1 连接数据库
python对sql文件的读写主要通过应用程序编程接口(API)进行,DB-API接口是python中访问关系型数据库的标准API,其主要函数为:
-
connect()
:连接数据库 , 参数包含用户名 、 密 码 、 服务器地址 等 , 具体为pymysql.connect(host=“数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
; -
cursor()
:创建一个cursor对象来管理查询; -
execute()
、executemany()
:对数据库执行一个或多个SQL命令; -
fetchone()
、fetchmany()
、fetchall()
:得到execute之后的结果。
6.2 创建操作
通过pymysql第三方库可以使用sql语句向在数据库中创建一张新的数据库和新的表格,具体创建表格的sql语句为:
CREATE TABLE 表名称
(
列名称1 数据类型,
列名称2 数据类型,
列名称3 数据类型,
....
)
使用创建语句时需要借助execute()对数据库执行,如在创建一个名为test的数据库,并在其中创建一张名称为TESTDB的二维表。
import pymysql
con=pymysql.connect(host='loscalhost',user='root',password='password',charset
='UTF8MB4')
cur = con.cursor()
cur.execute("create database test character set UTF8MB4;") #创建test数据库
cur.execute("use test;")
cur.execute("create table TESTDB(FIRST_NAME char(20), LAST_NAME char(20), AGE int(10), SEX char(20))") #创建TESTDB二维表并初始化
6.3 插入操作
sql语法为:INSERT INTO 表名称 VALUES (值1, 值2,....)
python借助execute()
对数据库执行
import pymysql
db = pymysql.connect("localhost","testuser","test","TESTDB" ) # 打开数据库连接
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = """INSERT INTO students (FIRST_NAME, LAST_NAME, AGE, SEX) VALUES ('Jenny',
'Black', 21, 'F')""" # SQL 插入语句
try:
cursor.execute(sql) # 执行sql语句
db.commit() # 提交到数据库执行
except:
db.rollback() # 如果发生错误则回滚
db.close() # 关闭数据库连接
6.4 查询操作
Python查询Mysql一般使用fetchone()
方法获取单条数据, 使用fetchall()
方法获取多条数据。
-
fetchone()
:该方法获取下一个查询结果集,结果集是一个对象 -
fetchall()
:接收全部的返回结果行. -
rowcount
:这是一个只读属性,并返回执行execute()方法后影响的行数。
查询students表中age(年龄)字段大于18的所有数据,示例如下:
import pymysql
db = pymysql.connect("localhost","testuser","test","TESTDB" ) # 打开数据库连接
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "SELECT * FROM students WHERE age > %s" % (18)# SQL 查询语句
try:
cursor.execute(sql) # 执行SQL语句
results = cursor.fetchall() # 获取所有记录列表
for row in results:
FIRST_NAME = row[0]
LAST_NAME = row[1]
AGE = row[2]
SEX = row[3]
print " FIRST_NAME=%s, LAST_NAME=%s, AGE=%s, SEX=%s " %(fname, lname, age, sex)# 打印结果
except:
print "Error: unable to fecth data"
db.close() # 关闭数据库连接
6.5 修改操作
sql语法为:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
以下实例将students表中的SEX字段为’F’的AGE字段减1。
import pymysql
db = pymysql.connect("localhost","testuser","test","TESTDB" ) #打开数据库连接
cursor = db.cursor() # 使用cursor()方法获取操作游标
sql = "UPDATE students SET AGE = AGE - 1 WHERE SEX = '%c'" % ('F')
#SQL 更新语句
try:
cursor.execute(sql) # 执行SQL语句
db.commit() # 提交到数据库执行
except:
db.rollback() # 发生错误时回滚
db.close() # 关闭数据库连接
删除操作
sql语法为:DELETE FROM 表名称 WHERE 列名称 = 值
以下实例将students表中的AGE字段小于18记录删除。
import pymysql
db = pymysql.connect("localhost","testuser","test","TESTDB" ) #打开数据库连接
cursor = db.cursor() #使用cursor()方法获取操作游标
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20) #SQL 删除语句
try:
cursor.execute(sql) # 执行SQL语句
db.commit() # 提交修改
except:
db.rollback() # 发生错误时回滚
db.close() # 关闭数据库连接