版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章爬虫之数据存储
数我们知道,网页中的数据基本都是非结构化数据。通过爬虫将网页抓取下来后,通过解析工具将非结构化数据提取出来,为了便于后继的数据分析处理,往往需要将解析后的数据变成半结构化和结构化的数据。本章节重点介绍常用的网页数据存储格式:TXT文本文件、JSON数据格式、CSV文件格式以及MYSQL数据库文件格式。在程序编写的过程中,一般的实际应用程序都会涉及大量的输入输出数据的处理。其中数据的存储和读取存取在磁盘介质上的数据是一项重要的工作。数据的存储一般有文本文件和数据库形式。常用的文本文件形式有cvs、txt、json等文本文件格式。本章主要讲解python中的文本文件处理。4.1Python语言之文件操作Python文本文件操作,分为写入文件和读取文件。文件读写的过程主要分为三个步骤,打开、读写、关闭。首先需要打开文件并创建文件对象,然后通过该文件对象对文件内容进行读写操作,最后关闭文件。文件的读操作就是从文件中取出数据到内存缓冲区中;文件的写操作就是将内存缓冲区中的数据输出到磁盘文件中。4.1.1文件的打开与关闭在对文件进行读写操作之前,首先需要打开文件,建立文件对象;文件读写结束后,必须关闭文件。Python提供了open()函数和close()函数完成相应的操作。1、打开文件open()函数4.1Python语言之文件操作open()函数首先创建一个文件对象,是有这个文件对象才完成后继的文件操作。open()函数的一般调用格式为:
文件对象名称=open(filename[,mode][,buffering])其中:open()函数常用形式是接收两个参数:文件名(filename)和模式(mode)。文件名不可缺少,模式缺省值为mode='r'。完整的语法格式和参数默认值为:open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)参数说明:((蓝色的常用参数)filename:要访问的文件名称的字符串值。要包含准确的路径信息(相对或者绝对路径)。mode:mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。buffering:指定了读写文件的缓存模式。0表示不缓存(仅在二进制模式下允许),1表示缓存(仅在文本模式下可用),如大于1则表示缓冲区的大小。默认值是缓存模式。如果取负值,寄存区的缓冲大小则为系统默认。4.1Python语言之文件操作encoding:指定对文本进行编码和解码的方式,只适用于文本模式,可以使用Python支持的任何格式,如GBK、utf8、CP936等等。errors:报错级别。参数errors是一个可选字符串,指定如何处理编码和解码错误。只在文本模式下使用。newline:
区分换行符。参数newline控制通用换行符模式的工作原理。仅适用于文本模式。取值可以是None、''、'\n'、'\r'、'\r\n'。如果newline为None,则启用通用换行符模式。closefd:传入的file参数类型。如果closefd是False并且给出的是文件描述器而不是文件名,则当文件关闭时,基本文件描述器将保持打开。如果给定文件名,则closefd必须为True(默认值),否则将产生错误。opener:通过传递可调用对象opener可以使用自定义开启器。注意:(1)执行正常,open()函数返回1个文件对象,通过该文件对象对文件进行读写;(2)创建文件对象失败则抛出异常;(3)文件内容操作完以后,一定要关闭文件对象;(4)即使写了关闭文件的代码,也无法保证文件一定能够正常关闭。例如,如果在打开文件之后和关闭文件之前发生了错误导致程序崩溃,这时文件就无法正常关闭。4.1Python语言之文件操作(5)在管理文件对象时推荐使用with关键字,可以有效地避免这个问题。withopen()语句的用法如下:withopen(filename,mode,[encoding])as文件对象:
文件操作程序模块使用with上下文管理模式,可以自动管理资源。不论何种因素跳出with块,文件都可以被正常关闭。2、文件打开模式mode参数在打开文件的操作模式中,通过mode参数设置文件的打开方式,见表4-1文件操作方式。4.1Python语言之文件操作模式描
述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。r+打开一个文件用于读写。文件指针将会放在文件的开头。表4-1文件操作方式rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。4.1Python语言之文件操作3、file对象方法通过文件的open()方法打开一个文件对象,可以通过文件对象提供的方法进行读取数据或写入数据等文件操作。表4-2为文件对象的常用方法。4.1Python语言之文件操作方
法描
述f.close()关闭文件。关闭后文件不能再进行读写操作。f.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件,而不是被动的等待输出缓冲区写入。f.fileno()返回一个整型的文件描述符(filedescriptorFD整型),可以用在如os模块的read方法等一些底层操作上。f.next()返回文件下一行。f.read([size])从文件读取指定的字节数,如果未给定或为负则读取所有。f.readline()读取整行,包括
"\n"字符。f.readlines()读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。f.seek(offset[,where])把文件指针移动到相对于where的offset位置,where为0表示文件开始处,这是默认值;1是表示当前位置;2是表示文件结尾。f.tell()返回文件当前指针位置。f.write(str)将字符串写入文件,返回的是写入的字符长度。f.writelines(seq)向文件写入一个字符串列表,如果需要换行则要自己加入每行的换行符。表4-2文件对象常用方法4、关闭文件close()方法文件打开后,完成读写等操作后,必须进行关闭操作,释放文件对象以供别的程序使用同时也可以避免文件中数据的丢失。关闭文件使用文件对象的close()方法关闭文件。语法格式为:f.close()close()方法用于关闭已打开的文件,将缓冲区中尚未存盘的数据写入磁盘,并释放文件对象。如果后面的程序继续使用这个文件,则必须重新打开。4.1Python语言之文件操作
文本文件是指以ASCII码方式存储的文件,文本文件中除了存储文件有效字符信息外,不能存储其他任何形式的数据信息。文件的操作一般包括从文件中读取数据操作进缓存区,或将缓存区中的数据写入文件中。1、文件读取Python对文件的操作通过调用文件对象的方法来实现的,文件对象提供了read()、readline()和readlines()三个方法用于读取文件内容。Read()方法:read()方法的用法为:
变量=文件对象.read([size])。
其功能是读取从当前位置开始读取size个字符,并作为字符串返回,赋值给变量。如果size的值大于文件当前位置到文件尾的字符数,则读到文件尾结束。如果没有给出size参数,其功能是读取从当前位置直到文件末尾的内容。如果是刚打开的文件,则是读取整个文件的内容。4.1.2文本文件的操作readline()方法:readline()方法的用法为:变量=文件对象.readline()。
其功能是读取当前文件位置指针指向的文件当前行,包括行结束符。如果当前指针位于文件尾,则返回空串。readlines()方法:readlines()方法的用法为:
变量=文件对象.readlines()。
其功能是读取从当前位置到文件尾的所有行,并将读取的所有行字符串数据构成列表返回,赋值给变量。文件中的每一行构成列表中的一个元素。如果指针位置在文件尾,则返回一个空列表。例4-1:已经建立一个data.txt文件,统计文件中的大写字符的个数。#用read()实现f=open('data.txt','r')strs=f.read()#读出所有的n=04.1.2文本文件的操作forcinstrs:if'a'<c<'z':n=n+1print(n)f.close()#用readline()实现f=open('data.txt','r')strs=f.readline()#读出一行n=0whilestrs!='':forcinstrs:if'a'<c<'z':n=n+1strs=f.readline()#读下一行print(n)f.close()4.1.2文本文件的操作#用readlines()实现f=open('data.txt','r')liststr=f.readlines()#读出一行n=0forstrinliststr:#读取列表中的每一行
forcinstr:#读取一行中的字符
if'a'<c<'z':n=n+1print(n)f.close()2、文件的数据写入写文件是将内存中的数据写入磁盘文件中。Python文件对象提供了两种写文件的方法:write()方法和writelines()方法。write()方法:write()方法的用法为:
文件对象.write(str)
其功能是在文件的当前位置写入字符串str并返回字符串的个数。特别注意的是:write()方法执行完后并没有换行功能,如果需要换行则在字符串最后加上换行符“\n”。(2)writelines()方法:writelines()方法的用法为:
文件对象.writelines(字符串元素的列表)
其功能是在文件的当前位置处依次写入列表中的所有字符串元素。writelines()方法接收一个字符串列表作为参数,将它们写入文件,它也不能自动加上换行符,如果需要,必须在列表中需要换行位置的每一行字符串结尾处加上换行符“\n”。4.1.2文本文件的操作例4-2:从键盘输入若干字符,将他们写入文件sample.txt。然后从该文件中读出文件内容,并在屏幕上显示出来。#write()方法print("======write()==========")y='yes'withopen('sample.txt','a+')asfp:#追加模式打开
whiley=='yes'ory=='y'ory=='Y':s=input("输入要写入的文件内容:")s=s+"\n"fp.write(s)y=input("是否继续输入(yes/y/Y):")else:print("输入结束")fp.close()withopen('sample.txt','r')asfp:print(fp.read())4.1.2文本文件的操作#writelines()方法print("======writelines()==========")y='yes'lst=[]whiley=='yes'ory=='y'ory=='Y':s=input("输入要写入的文件内容:")s=s+"\n"lst.append(s)y=input("是否继续输入(yes/y/Y):")else:print("输入结束")withopen('sample.txt','a+')asfp:fp.writelines(lst)fp.close()withopen('sample.txt','r')asfp:print(fp.readlines())4.1.2文本文件的操作注意:(1)若写入的文件不存在,函数open()将自动创建。以w写入模式打开文件时,每次写入都会清空之前内容,写入新的内容。(2)写入必须是字符串格式,如果不是字符串,写入前需转为字符串格式(3)函数write()不会在写入文本末尾自动换行,如果要换行,需添加换行符(4)写入中文,设置encoding='utf-8',如“withopen('1.txt','w',encoding='utf-8')asf:”。1、文件中列表数据的读写Python语言虽然提供了readlines()和writelines()语法,可以实现字符串元素列表的操作,但这两个命令读写的都必须是["python","c++","java"]这种形式的列表。如下列的列表按照readlines()和writelines()方法写入文件中:例4-3:文件中列表数据读写。data=[['a','b','c'],['a','b','c'],['a','b','c']]lst=["python","c++","java"]withopen("1.txt","w")asf:f.writelines(lst)foriindata:f.writelines(i)withopen("1.txt","r")asf:print(f.readlines())运行的结果为:['pythonc++javaabcabcabc']4.1.3列表和字典的读写这样的结果,如果要恢复原来的数据结构形式,将无法进行分割恢复。如何恢复复杂列表数据的文件读写,可以使用str()和split()以及eval()函数,将列表转换成字符串加上换行符’\n’,写入文件;读出时,使用split(’\n’)作为分隔符,返回字符串数据;在使用eval()将字符串转换为列表。其中要注意去除空字符串。程序如下:4.1.3列表和字典的读写withopen("2.txt","w")asf:f.write(str(lst)+'\n')foriindata:f.write(str(i)+'\n')withopen("2.txt","r")asf:res=f.read()f.close()
lststr=res.split('\n')print("lststr=",lststr)forsinlststr:ifs!='':lst1=eval(s)print(lst1,type(lst1))输出结果:lststr=["['python','c++','java']","['a','b','c']","['a','b','c']","['a','b','c']",'']['python','c++','java']<class'list'>['a','b','c']<class'list'>['a','b','c']<class'list'>['a','b','c']<class'list'>2、文件中读写字典Python语言中没有提供字典数据写入文本文件的功能,如果将字典数据写入文本文件和读出数据并恢复为字典数据,可以通过一下两个方法完成。以下列字典数据为例:d={"nhy":"123456","ylm":"456789","abc":123,"city":"shanghai","skill":"js"}(1)使用json转换方法字典写入txt。使用json.dumps把字典转成json串写入文件。importjsonres=json.dumps(d,indent=4,ensure_ascii=False)#把字典转成json串f=open('test.txt','w',encoding='utf-8')f.write(res)f.close()读取txt中的字典。使用json.loads把文本文件中的json串转成字典。4.1.3列表和字典的读写f=open('test.txt')res=f.read()print('res的类型',res,type(res))d=json.loads(res)#把json串转成字典print("d=json.loads(res)=",d)f.close()(2)使用str和eval函数转换方法(也适用于列表)。字典写入txt。使用str函数将字典转化为字符串,写入文件。fw=open("test.txt",'w+')fw.write(str(dic))#把字典转化为strfw.close()读取txt中字典。使用eval函数将读取的文本文件中的字符串转换为字典类型。fr=open("test.txt",'r+')dic=eval(fr.read())#读取的str转换为字典print(dic)fr.close()4.1.3列表和字典的读写4.2.1CSV简介CSV是引文Comma-SeparatedValue即逗号分隔值的缩写,因分隔符没有严格的要求,可以使用逗号,也可以使用其他字符(如制表符\t,分号等),所以CSV也被称为逗号分隔或者其他字符分隔值。CSV文件是使用纯文本来存储表格数据,只能存储文本,不能存储二进制信息。CSV是一种通用的、相对简单的文件格式,最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的,因为大量程序都支持某种CSV文件,所以CSV文件可作为一种中间的输入/输出格式,它可以很容易地被导入各种表格及数据库中。CSV文件用记事本和Excel都能打开,用记事本打开显示逗号,用Excel打开,逗号被用作了分列符号。文件后缀为“.csv”。4.2CSV格式文件处理2、CSV的界面操作CSV文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,每个字符都是默认以逗号分隔。在Windows系统环境中,可以像word、execl等文本文件一样编辑。(1)打开方式:.csv文件打开方式有多种,如记事本、Excel、Wordpad等,只要是文本编辑器都能正确打开。(2)创建方式:使用记事本或Excel创建CSV文件。新建文件,按文本或Excel文件进行编辑。注意:在记事本中编辑时,关键字与关键字之间使用英文逗号隔开,第一行为引用字段,第二行为对应值。生成.csv文件。方式一:记事本:文件-另存为-命名文件名-选择编码utf-8,最后保存;Excel:另存为-其它格式-选择文件类型-命名文件名,最后保存。方式二:保存文档后直接修改文件后缀为“.csv”。4.2CSV格式文件处理3、文件格式
CSV文件是一种常用的数据交换格式。既可以使用记事本打开,也可以使用Excel文件打开。CSV文件数据都是字符型文本,但又区别于TXT文件的无格式,CSV文件可以设计表头,有一定的数据格式。如是界面操作,内容有以下的特殊格式字符,建议使用Excel编辑。下面我们介绍一下CSV文件的基本格式:(1)每条记录占一行,以逗号为分隔符,逗号分隔的部分称为字段;(2)逗号前后的字段中的空格会被忽略;(3)字段中如包含有逗号、换行符、空格,该字段必须用双引号括起来;(4)字段中如包含双引号,则用两个双引号表示;(5)第一条记录,可以是字段名。4.2CSV格式文件处理python3CSV模块中主要的方法是实现对CSV的读写操作与格式转换。python3.x集成了对CSV文件的操作,直接引入CSV包即可。1、使用csv库使用csv库前,先导入csv库:importcsv。2、文件的打开与关闭(1)open()(withopen)方法这两个方法和python文件操作中的功能一样,都是实现打开文件的功能。使用open()将创建一个csv对象。语法使用示例如:csvfile=open('例421.csv',’r’,newline='')#读方式打开csvfile=open('例421.csv',’w’,newline='')#写方式打开或等价:withopen('例421.csv',’r’,newline='')ascsvfilewithopen('例421.csv',’w’,newline='')ascsvfile4.2.2python3CSV模块常用类与方法注意:在CSV文件操作中,涉及中文的读写时,需加上参数“encoding='utf-8-sig'”。打开csv文件需要添加一个参数newline=”,避免出现空行的状态。(2)csvfile.close()方法:关闭打开的CSV对象csvfile。csv文件提供了两类的读写操作,一是csv.reader()和csv.writer()方法;二是提供了字典方式读写类:csv.DictReader()、csv.DictWriter()。下面我们将介绍两类读写操作的语法与使用。4.2.2python3CSV模块常用类与方法3、csv文件读操作:csv.reader()和csv.DictReader()(1)csv.reader()方法csv_reader=csv.reader(iterable[,dialect='excel'][,**fmtparams])其中参数:iterable:是任何可迭代对象,可以为每次迭代生成一个完整的文本行。返回的reader对象“csv_reader”是一个迭代程序,可以为每次迭代生成一列字符串。dialect:可以缺省,缺省值为dialect='excel';dialect参数的目的主要是处理不同CSV编码之间的差异。该模块仅支持两个内置方言—'excel'和'excel-tab’,可以缺省,缺省值为dialect='excel';但用户可以定义其他方言。**fmtparams:格式化参数,可缺省。用来覆盖之前dialect对象指定的编码风格。4.2.2python3CSV模块常用类与方法(2)csv.DictReader()类csv_reader=csv.DictReader(f[,fieldnames=None,restkey=None,restval=None,dialect='excel',**fmtparams])csv.DictReader()的功能是将读取的信息映射到字典中。
该字典的键由可选的参数fieldnames指定。如果省略fieldnames参数,则csvfile第一行中的值将用作字段名。在介绍参数之前,我们来了解一下csv文件的格式。如图4-1所示。4.2.2python3CSV模块常用类与方法在图4-1所示的csv文件中,DictReader会将第一行的内容(类标题)作为字典的key值,第二行开始才是对应的字典value数据内容。即图中的csv文件有2列7行数据,第一列的key值为first_name,第二列的key值为last_name。csv.DictReader()的参数:f:为读取的文件对象;fieldnames:指定在返回的字典中用作键的字段名称。如果忽略该参数,将从输入文件的第一行取得字典键名称。默认值为fieldnames=None;restkey:提供用来存储超额数据的字典键名称,例如,行的数据字段比字段名称多时可以指定该参数。默认值为restkey=None;restva:指定输入中缺少值的字段的默认值,在行中没有足够的字段时可以指定该参数,默认值为restval=None;dialect和fmtparams的含义与reader()中的同名参数含义相同。4.2.2python3CSV模块常用类与方法例4-5:读取names.csv中的数据。importcsvdefreader_n(file):#行读
withopen(file,'r',newline='')ascsv_file:csv_reader=csv.reader(csv_file)forrowincsv_reader:print("row=",row,";row的类型=",type(row))csv_file.close()defread_col(file):#列读
withopen(file,"r")asfp:reader=csv.reader(fp)#reader是一个迭代器
next(reader)#如果不需要输出标题,可以next()方法,把迭代器往下挪
forxinreader:#这样通过下标的方式去获取
first_name=x[0]last_name=x[1]print({"first_name":first_name,"last_name":last_name})fp.close()4.2.2python3CSV模块常用类与方法defD_reader(file):#字典读
withopen(file,'r')ascsv_file:csv_reader1=csv.DictReader(csv_file)ford_rowincsv_reader1:print("d_row=",d_row,"\n"+"d_row的类型=",type(d_row))csv_file.close()reader_n('names.csv')read_col('names.csv')D_reader('names.csv')从输出结果中可以发现,可用for循环迭代输出每一行数据,输出的数据类型分别为备注:在版本3.6中更改:现在返回的行类型为OrderedDict。在版本3.8中更改:现在返回的行的类型为dict。列表和字典类型。4.2.2python3CSV模块常用类与方法4、csv文件写操作:csv.writer()和csv.DictWriter()(1)csv.writer()方法csv_writer=csv.writer(csvfile,[,dialect='excel',**fmtparams])csv.writer()的功能是返回一个csv文件写入(writer)对象。返回的writer对象如“csv_writer”提供两个方法完成数据写入:csv_writer.writerow(row):将row行参数写入到文件对象,并根据当前的方言格式化;csv_writer.writerows(rows):将rows中的所有元素,行对象的迭代写入到文件对象。一次写入多行数据。4.2.2python3CSV模块常用类与方法(2)csv.DictWriter()方法:csv_writer=csv.DictWriter(fileobj,fieldnames[,restval='',extrasaction='raise',dialect='excel',*args,**kwds])csv.DictWriter()方法的功能是创建一个字典形式的csv写入对象。序列数据将按照fieldnames参数作为字典键key的顺序被写入。参数:fileobj:写入的文件对象;fieldnames:指定字典键key,列表数据类型;restval:可选的参数。如果字典字段名中的键缺少相应的值时,即写入restval的值;extrasaction:如果传递给该writerow()方法在fieldnames中找不到的相应的键,则可选的extrasaction参数指示要执行的操作。如果将其默认值设置为'raise',则抛出一个“ValueError”异常。如果设置为'ignore',字典中的多余值将被忽略。其他任何可选参数等同与writer()方法。请注意,与DictReader类不同,该类的fieldnames参数DictWriter不是可选的。4.2.2python3CSV模块常用类与方法返回的DictWriter对象如“csv_writer”提供三个方法完成数据写入:csv_writer.writerow(row)和csv_writer.writerows(rows):功能与csv.writer()方法相同;csv_writer.writeheader():将对象csv.DictWriter(fileobj,fieldnames)中“fieldnames”作为文件头写入文件作为字段名,只适用于DictWriter对象。例4-6:写入数据到csv文件中。importcsv#DictWriterwithopen('names.csv','w',newline='')ascsvfile:fieldnames=['first_name','last_name']writer=csv.DictWriter(csvfile,fieldnames=fieldnames)writer.writeheader()4.2.2python3CSV模块常用类与方法writer.writerow({'first_name':'Baked','last_name':'Beans'})writer.writerow({'first_name':'Lovely','last_name':'Spam'})writer.writerow({'first_name':'Wonderful','last_name':123})#writerowsNamelist=[{'first_name':'王平','last_name':'王小二'},{'first_name':'李华','last_name':'梨花'},{'first_name':'君川','last_name':'骏川'}]writer.writerows(namelist)csvfile.close()#writerwithopen('names.csv','a',newline='')ascsvfile:spamwriter=csv.writer(csvfilefieldn=['姓名','小花']spamwriter.writerow(fieldn)spamwriter.writerow(['Spam']*5+['BakedBeans'])spamwriter.writerow(['Spam','LovelySpam','WonderfulSpam'])csvfile.close()4.2.2python3CSV模块常用类与方法针对最后两条的写入,数据值的数量比“fieldnames=['first_name','last_name']”的字段数量多的情况下,可以看见字典类型的输出结果为:d_row={'first_name':'Spam',None:['Spam','Spam','Spam','BakedBeans'],'last_name':'Spam'}d_row={'first_name':'Spam',None:['WonderfulSpam'],'last_name':'LovelySpam'}4.2.2python3CSV模块常用类与方法注意:写入数据时,非字符串类型的数据会被str()成字符串存储。写入数据到csv文件时,如果csvfiel是一个文件对象,应该用newline=''指定换行符。默认的情况下,读和写使用逗号做分隔符(delimiter),用双引号(")作为引用符,当遇到特殊情况时,可以根据需要手动指定字符,例如:importcsvwithopen('names.csv','r')asf:reader=csv.reader(f,delimiter=':',quoting=csv.QUOTE_NONE)forrowinreader:print(row)上述示例指定“:”冒号作为分隔符,并且指定引用“quoting“方式为不引用。这意味着读的时候都认为内容是不被默认引用符(")包围的。4.2.2python3CSV模块常用类与方法例4-7:爬取豆瓣读书的图书网页,提取作者、译者、出版社、单价、出版年份、读者评分等信息,写入csv文件中。在本案例中,我们打开豆瓣,找到需要提取的网页,打开网页查看html代码,可以发现,豆瓣读书的图书分类索引页/tag/的html代码,使用bs4的select()定位方法“tags=soup.select('#contentdivdivtabletbodytrtda')”找到每一类的图书索引地址:url=[]fortagintags:tag=tag.get_text()href='/tag/'pageurl=href+str(tag)url.append(pageurl)4.2.3应用案例然后找到每一类的网页如小说的网页,打开网页的html代码,找到需要提取的信息部分的代码,同样,使用bs4的select()方法定位到有效位置,提取所有的有效信息,如“booknames=soup.select(‘div#subject_list>ul.subject-list>li.subject-item>>h2>a’)”。完整代码见例4-7。JSON,全称为JavaScriptObjectNotation,也就是JavaScript对象标记,它通过对象和数组的组合来表示数据,构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。通过爬虫从网页中提取的信息,很多是JavaScript语言描述的数据,应用json格式的文件存储有时更便利。JSON文件的后缀名为.json。JSON文件可以用记事本、浏览器打开,也可以利用文件编辑器打开。4.3JSON文件格式在JSON中,值必须是以下数据类型之一:字符串、数字、对象(JSON对象)、数组、布尔、Null。JSON的值不可以是以下数据类型之一:函数、日期、Undefined(未定义类型)。1、JSON字符串和JSON数字JSON中的字符串必须用双引号包围。JSON中的数字必须是整数或浮点数。如:{"name":"John"};{"age":30}2、JSON对象JSON对象在花括号中书写,对象可以包含多个名称/值对:如:{"firstName":"John","lastName":"Doe"},等价于JavaScrip中的:firstName="John"lastName="Doe"4.3.1JSON数据类型3、JSON数组JSON数组用方括号[]表示,数组可包含多个对象。如我们定义一个名称为"employees"的JSON对象,有多个值组成,多值可以使用数组表示:{"employees":[{"firstName":"John","lastName":"Doe"},{"firstName":"Anna","lastName":"Smith"},{"firstName":"Peter","lastName":"Jones"}]}在上面的例子中,对象"employees"是包含三个对象的数组。每个对象代表一条关于某人(有姓和名)的记录。4.3.1JSON数据类型4、JSON布尔和JSONNull在JSON中,值可以是布尔值、Null值。JSON布尔值可以是True或False。如:{"sale":True};{"middlename":Null}。4.3.1JSON数据类型使用pythondejson库时需要先导入json库:importjsonPython语言中提供了json库实现数据格式的转换功能。在json模块中主要有4个方法如表4-3所示:load()、loads()、dump()、dumps()。4.3.2Python的JSON库函数描述json.dumps()将
Python对象编码成
JSON字符串。json.dump()将
Python对象编码成
JSON字符串,并写入文件。json.loads()将已编码的
JSON字符串解码为
Python对象。json.load()从JSON文件中读取JSON字符串,并将JSON字符串解码为
Python对象。1、json.dumps()方法:将Python对象编码成JSON字符串。语法:json_str=json.dumps(obj[,skipkeys=False,ensure_ascii=True,check_circular=True,allow_nan=True,cls=None,indent=None,separators=None,encoding="utf-8",default=None,sort_keys=False,**kw])obj:python数据对象,即需要转换的数据对象;skipkeys:在encoding编码过程中,字典dict对象的key只可以是字符串str对象,如果是其他类型,那么在编码过程中就会抛出ValueError的异常。skipkeys可以跳过那些非str对象当作key的处理;indent:定义数据缩进显示格式。indent的值,代表缩进空格。应该是一个非负的整型,如果是0,或者为空,则按一行显示数据;否则会换行且按照indent的数量显示前面的空白;sort_keys:将数据按照字典key排序(a到z)进行排序输出;ensure_ascii:解码方式,默认True是ASCII码。如输出中文此参数设为“ensure_ascii=False”。4.3.2Python的JSON库2、json.dump()方法:将python对象编码成JSON字符串后写入到参数“fp”对象。语法:dump(obj,fp[,……])json.dump()方法的参数比json.dumps()多了一个“fp”对象,“fp”一般为文件对象。其他参数同json.dumps()。3、将python对象写入JSON文件:下面分别用两种方法将数据写入json文件。例4-8:将数据写入json文件。importjsondata={"employees":[{"firstName":"John","lastName":"Doe"},{"firstName":"Anna","lastName":"Smith"},{"firstName":"Peter","lastName":"Jones"}]}4.3.2Python的JSON库#利用dumps()方法,调用python文件操作的write()方法写入文本。defw_dps(file):withopen(file,'w')asf:jdata=json.dumps(data)f.write(jdata)f.close()#dump()方法defw_dp(file):withopen(file,'w')asf:json.dump(data,f)f.close()w_dps("js.json")w_dp("js1.json")4.3.2Python的JSON库4、json.loads()方法:JSON字符串转换成python数据类型。pobj=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对象;object_hook:可选参数。它会将(loads的)返回结果(一般是字典)替换为指定的类型;object_pairs_hook:可选参数。它会将结果以键值对(key-value)有序列表的形式返回。如果object_hook和object_pairs_hook同时指定,则优先返回object_pairs_hook;parse_float:可选参数。设置这个参数后,在解码json字符串的时候,符合float类型的字符串将被转设定的类型,如parse_float=decimal.Decimal;parse_int:可选参数。设置这个参数后,在解码json字符串的时候,符合int类型的字符串将被转为设定的类型,如p=json.loads("123",parse_int=float)。4.3.2Python的JSON库在json的编解码过程中,python的原始类型与json类型会相互转换,具体的转化对照如表4-5所示:4.3.2Python的JSON库JSON数据Python数据Object对象Dict字典Array数组List列表String字符串Str字符串number(int)整数字符Int整数number(real)实数字符Float浮点数trueTruefalseFalsenullNone5、json.load()方法语法:pobj=json.load(fp[,encoding=None,cls=None,object_hook=None,parse_float=None,parse_int=None,parse_constant=None,object_pairs_hook=None,**kw])json.load()方法的功能是将json文件流中的数据,读取出来并转换成对应的python数据类型。对于json.loads()方法来说,输入的“s”是一个字符串;而对于json.load()方法来说,输入的“fp”是一个数据流文件。两个方法只是处理的数据源不同,其他的参数都是相同的,返回的结果类型也相同。4.3.2Python的JSON库例4-9:将字符串数据转换为对应的Python数据类型,写入文件并读取。importjsonfromcollectionsimportOrderedDict#collections是一个python的内建模块,有序字典输出str1="""[{"姓名":"lisha","性别":"male","年龄":"46"},{"姓名":"jhon","性别":"female","年龄":"44"}]"""jdata=json.loads(str1,object_pairs_hook=OrderedDict)#将json格式字符串输出原有顺序print("jdata=",jdata)print("jdata的数据类型=",type(jdata))print("第一项的姓名=",jdata[0]['姓名'])print("第一项的姓名=",jdata[0].get('姓名'))4.3.2Python的JSON库withopen('data.json','w')asf:f.write(json.dumps(jdata))#jdata是json对象
#读取数据withopen('data.json','r')asf:str2=f.read()jdata1=json.loads(str2)print("str2=",str2)print("jdata1=",jdata1)#=====或者用以下方式======withopen('data.json','w')asf:json.dump(jdata,f,ensure_ascii=False)withopen('data.json','r')asf:jdata2=json.load(f)print("jdata2=",jdata2)4.3.2Python的JSON库在python3.x版本中,主要支持pymysql,同时mysql官方也给出mysql.connector插件,在python3.x也可以使用。下面本文将主要介绍Python中MySQLConnector模块使用方法。pymysql的使用方法类似。4.4.1MySQLConnectorMySQLConnectorPython是一个用Python语言实现的MySQL户端服务器的连接协议。该软件包无需安装任何MySQL的软件。下面我们详细的介绍mysql-connector-python模块,以便于在python中操作mysql数据库。1、安装可以直接使用pip来安装mysql-connector-python模块。在cmd窗口下,转换到python的安装目录下,输入写命令行,成功安装的提示如图4-2:4.4python与mysql数据库pipinstallmysql-connector-python4.4python与mysql数据库如果安装不成功,也可以下载安装。下载地址:/downloads/connector/python/。如下载版本文件“mysql-connector-python-8.0.15-py3.5-windows-x86-64bit.msi”,下载后根据提示安装。注意:不要安装这个分支模块“pipinstallmysql-connector”,已经停止更新。2、数据库连接连接数据库的代码如下,其中的参数为数据库的配置参数:4.4python与mysql数据库importmysql.connectorconfig={'host':'',#默认。
'user':'root','password':'123456','port':3306,#默认即为3306'database':'test','charset':'utf8'#默认即为'utf8'}try:cnn=mysql.connector.connect(**config)exceptmysql.connector.Errorase:
print('connectfails!{}'.format(e))cur=cnn.cursor()#创建游标4.4python与mysql数据库3、数据库操作
显示所有数据库、创建新的数据库文件、指定当前操作的数据库以及删除数据库的操作。在mysql中的命令为:showdatabases;
#显示所有数据库createdatabaseifnotexistst1;
#数据库不存在就创建数据库t1usedatabaset1;
#指定当前操作的数据库为t1dropdatabaseifexistst1;
#删除数据库t1在python中的mysql.connector模块中,操作为(默认使用上述的数据库链接和游标):cur.execute('createdatabaseifnotexistst1')#创建数据t1cur.execute('SHOWDATABASES')#显示服务器所有数据库,大小写都可以fordbincur.fetchall():#cur.fetchall(),提取游标中的所有数据
print(db)#打印数据库信息cur.execute('usedatabaset1')4.4python与mysql数据库4、创建表和删除表创建表:CREATETABLEifnotexists表名称在我们指定对相应的数据库操作,如cur.execute('usedatabaset1')指定数据库t1后,下面我们可以使用创建数据库表操作,创建一张名为student的表,如下面的代码将在t1数据库下新建了一张名为“student”的表文件,在创建表之前,需要判断一下表是否存在,以防止文件已存在报错。sql_create_table="""CREATETABLEifnotexistsstudent(idint(10)NOTNULLAUTO_INCREMENT,namevarchar(10)DEFAULTNULL,ageint(3)DEFAULTNULL,PRIMARYKEY(id))ENGINE=MyISAM"""try:
cur.execute(sql_create_table)
mit()exceptmysql.connector.Errorase:
print('createtablestudentfails!{}'.format(e))4.4.1MySQLConnector删除表:DROPTABLEifexists表名称cur.execute('showtables')foriincur.fetchall():sql="DROPTABLEIFEXISTS{}".format(i)
try:
cur.execute(sql)
mit()
print('table:{}--已被删除'.format(i))exceptmysql.connector.Errorase:
p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 领导扶贫纪实工作制度
- 风电维护公司工作制度
- 食品安全生产工作制度
- 黄码医院护士工作制度
- 辽阳市弓长岭区2025-2026学年第二学期三年级语文第八单元测试卷(部编版含答案)
- 绥化市海伦市2025-2026学年第二学期四年级语文第七单元测试卷(部编版含答案)
- 九江市永修县2025-2026学年第二学期三年级语文第八单元测试卷(部编版含答案)
- 常德市安乡县2025-2026学年第二学期三年级语文第七单元测试卷(部编版含答案)
- 农网配电营业工班组协作模拟考核试卷含答案
- 船舶特大型起重机驾驶工达标考核试卷含答案
- 2026年CAAC无人机理论考试题库(修订版)
- 《字符编码》教学课件-2025-2026学年浙教版(新教材)小学信息科技四年级下册
- 2026年宁波城市职业技术学院单招职业技能测试题库及完整答案详解1套
- 2026年春湘美版(新教材)初中美术八年级下册教学计划及进度表
- 我国民间借贷法律困境及化解路径探究
- 华鲁恒升招聘笔试题库
- SIS安全仪表培训资料课件
- 【《某乒乓球训练机的横向移动装置结构计算设计案例》3600字】
- 加油站安全管理员安全目标责任书
- 硬笔书法:幼小衔接识字写字教学课件
- 甘肃省药品零售连锁企业(总部)验收标准
评论
0/150
提交评论