自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程菜鸟iglesias的博客

一个编程菜鸟的学习里程

  • 博客(100)
  • 收藏
  • 关注

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-在SQL中使用Python函数

7.4.13 在SQL中使用Python函数SQL语法支持在查询中调用函数,可以在“列”列表中调用,也可以在select语句的where子句中调用。利用这个特性,在从查询返回数据之前可以先处理数据。这个特性可以用于在不同格式之间转换,完成一些计算(否则使用纯SQL会很麻烦),以及重用应用代码。import codecsimport sqlite3db_filename = 'todo.d...

2019-03-31 15:17:29 223

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-导出数据库内容

7.4.12 导出数据库内容内存中数据库的内容可以使用Connection的iterdump()方法保存。iterdump()返回的迭代器生成一系列字符串,这些字符串将共同构造相应的SQL指令来重新创建数据库的状态。import sqlite3schema_filename = 'todo_schema.sql'with sqlite3.connect(':memory:') as c...

2019-03-31 14:53:18 192

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-内存中的数据库

7.4.11 内存中的数据库SQLite支持在RAM中管理整个数据库,而不是依赖一个磁盘文件。内存中数据库对于自动测试很有用,在自动测试中,运行测试之间不需要保留数据库,或者想要尝试一个模式或其他数据库特性时,内存中数据库也很有用。要打开一个内存中数据库,创建Connection时可以使用字符串’:memory:‘而不是一个文件名。每个’:memory:'连接会创建一个单独的数据库实例,所以一个...

2019-03-31 14:36:28 156

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-隔离级别

7.4.10 隔离级别sqlite3支持3种加锁模式,也被称为隔离级别(isolation level),这会控制使用何种技术来避免连接之间不兼容的变更。打开一个链接时可以传入一个字符串作为isolation level参数来设置隔离级别,所以不同的链接可以使用不同的隔离级别值。下面这个程序展示了使用同一个数据库的不同连接时,不同的隔离级别对于线程中事件的顺序会有什么影响。这里创建了4个线程:两...

2019-03-31 11:58:27 912

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-事务-丢弃变更

7.4.9.2 丢弃变更还可以使用rollback()完全丢弃未提交的变更。commit()和rollback()方法通常在同一个try:except块的不同部分调用,有错误就会触发回滚。import sqlite3db_filename = 'todo.db'def show_projects(conn): cursor = conn.cursor() cursor....

2019-03-30 09:56:11 85

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-事务-保留变更

7.4.9 事务关系数据库的关键特性之一是使用事务来维护一致的内部状态。启用事务时,在提交结果并刷新输出到真正的数据库之前,可以通过一个连接来完成多个变更而不影响任何其他用户。7.4.9.1 保留变更不论是通过插入(insert)还是更新(update)语句来改变数据库,都需要显式地调用commit()保存这些变更。这个要求为应用提供了一个机会,可以让多个相关的变更一同完成,使它们以一种"原...

2019-03-30 09:54:29 107

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-确定列类型

7.4.8 确定列类型要得到查询数据类型的有关信息,有两个来源。可以用原表声明找出一个列的类型,这在前面已经看到。另外还可以在查询本身的select子句中包含形式为"name[type]"的类型指示符。import pickleimport sqlite3db_filename = 'todo.db'def adapter_func(obj): """Convert from...

2019-03-30 09:05:45 83

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-定义新的列类型

一二三

2019-03-30 08:40:35 162

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-批量加载

7.4.6 批量加载要对一个很大的数据集应用相同的SQL指令,可以使用executemany()。这个方法对于加载数据很有用,因为这样可以避免在Python中忙处理输入,而允许底层的库应用循环优化。下面这个示例程序使用csv模块从一个逗号分隔值文件读取任务列表,并把它们加载到数据库。import csvimport sqlite3import sysdb_filename = 'to...

2019-03-29 19:13:58 137

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-在查询中使用变量-命名参数

7.4.5.2 命名参数对于包含大量参数的更为复杂的查询,或者如果查询中某些参数会重复多次,则可以使用命名参数。命名参数前面有一个冒号前缀(例如,:param_name)。import sqlite3import sysdb_filename = 'todo.db'project_name = sys.argv[1]with sqlite3.connect(db_filename)...

2019-03-29 18:37:25 233

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-在查询中使用变量-位置参数

7.4.5 在查询中使用变量如果查询被定义为字面量字符串,要嵌入到程序中,那么使用这种查询会很不灵活。例如,向数据库增加另一个项目时,显示前5个任务的查询就应当更新,从而能处理其中任意一个项目。要向增加灵活性,一种方法是建立一个SQL语句,通过在Python中结合相应的值来提供所需的查询。不过,以这种方式构造查询串很危险,应当尽量避免。如果未能对查询中可变部分的特殊字符正确地转义,则可能会导致S...

2019-03-29 18:14:04 204

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-行对象

7.4.4 行对象默认地,获取方法从数据库返回的“行”值是元组。调用者要负责了解查询中列的顺序,并从元组中抽取单个的值。查询的值个数增加时,或者处理数据的代码分布在一个库的不同位置时,通常比较容易的做法是使用一个对象,并用它的列名来访问值。这样一来,编辑查询时,元组内容的个数和顺序会随之改变,并且依赖于查询结果的代码也不太会出问题。Connection对象有一个row_factory属性,允许...

2019-03-29 17:35:10 123

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-查询元数据

7.4.3 查询元数据DB-API 2.0规范指出:调用execute()之后,Cursor应当设置其description属性来保存数据的有关信息,这些信息将由获取方法返回。API规范指出这个描述值是一个元组序列,元组包含列名、类型、显示大小、内部大小、精度、范围和一个指示是否接受null值的标志。import sqlite3db_filename = 'todo.db'with s...

2019-03-28 20:10:09 145

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-获取数据

7.4.2 获取数据要从一个Python程序中获取task表中保存的值,可以从数据库连接创建一个Cursor。游标(cursor)会生成一致的数据视图,这也是与类似SQLite的事务性数据库系统交互的主要方式。import sqlite3db_filename = 'todo.db'with sqlite3.connect(db_filename) as conn: curso...

2019-03-28 19:57:08 138

转载 第七章:数据持久存储与交换-sqlite3:嵌入式关系数据库-创建数据库

7.4 sqlite3:嵌入式关系数据库sqlite3模块为SQLite提供了一个DB-API 2.0兼容接口,SQLite是一个进程中关系数据库。SQLite被设计为嵌入在应用中,而不是像MySQL,PostgreSQL或Oracle那样使用一个单独的数据库服务器程序。SQLite的速度很快,并且经过了严格的测试,很灵活,所以非常适合为一些应用建立原型和完成生成部署。7.4.1 创建数据库...

2019-03-28 18:41:07 205

转载 第七章:数据持久存储与交换-dbm:UNIX键值数据库-错误情况

7.3.4 错误情况数据库的键必须是字符串。import dbmwith dbm.open('/tmp/example.db','w') as db: try: db[1] = 'one' except TypeError as err: print(err)如果传入其他类型则会导致一个TypeError。运行结果:keys mus...

2019-03-27 18:38:36 155

转载 第七章:数据持久存储与交换-dbm:UNIX键值数据库-打开一个现有数据库

7.3.3 打开一个现有数据库要打开一个现有数据库,可以使用flags ‘r’(只读)或’w’(读写)。会自动将现有的数据库提供给whichdb()来识别,所以只要一个文件可以识别,便能使用一个适当的模块打开这个文件。import dbmwith dbm.open('/tmp/example.db','r') as db: print('keys():',db.keys()) ...

2019-03-27 18:36:36 95

转载 第七章:数据持久存储与交换-dbm:UNIX键值数据库-创建一个新数据库

7.3.2 创建一个新数据库通过按顺序查找以下各个子模块的可用版本来选择新数据库的存储格式。dbm.gnudbm.ndbmdbm.dumbopen()函数接收flags来控制如何管理数据库文件。如果要在必要时创建一个新的数据库,则可以使用’c’。使用’n’则总会创建一个新数据库,并覆盖现有的文件。import dbmwith dbm.open('tmp\example.db','n...

2019-03-27 18:34:40 147

转载 第七章:数据持久存储与交换-dbm:UNIX键值数据库-数据库类型

7.3 dbm:UNIX键值数据库dbm是面向DBM数据库的一个前端,DBM数据库使用简单的字符串值作为键来访问包含字符串的记录。dbm使用whichdb()标识数据库,然后用适当的模块打开这些数据库。dbm还被用作shelve的一个后端,shelve使用pickle将对象存储在一个DBM数据库中。7.3.1 数据库类型Python提供了很多模块来访问DBM数据库。具体选择的默认实现取决于当...

2019-03-27 18:31:32 218

转载 第七章:数据持久存储与交换-shelve:对象的持久存储-写回(特定shelf类型)

7.2.2 写回默认地,shelf不会跟踪对可变对象的修改。这说明,如果存储在shelf中的一个元素的内容有变化,那么shelf必须再次存储真个元素来显式地更新。import shelvewith shelve.open('test_shelf.db') as s: print(s['key1']) s['key1']['new_value'] = 'this was no...

2019-03-26 18:41:12 214

转载 第七章:数据持久存储与交换-shelve:对象的持久存储-创建一个新shelf

7.2 shelve:对象的持久存储不需要关系数据库时,可以用shelve模块作为持久存储Python对象的一个简单的选择。类似于字典,shelf按键访问。值将被腌制并写至由dbm创建和管理的数据库。7.2.1 创建一个新shelf使用shelve最简单的方法就是利用DbfilenameShelf类。它使用dbm存储数据。这个类可以直接使用,也可以通过调用shelve.open()来使用。...

2019-03-26 18:09:27 211

转载 第七章:数据持久存储与交换-pickle:对象串行化-循环引用

7.1.5 循环引用pickle协议会自动处理对象之间的循环引用,所以复杂数据结构不需要任何特殊的处理。考虑图7-1中的有向图。这个图中包含几个环,不过仍然可以腌制所得的正确结构然后重新加载。import pickleclass Node: """A simple digraph """ def __init__(self,name): self....

2019-03-25 20:18:00 160

转载 第七章:数据持久存储与交换-pickle:对象串行化-不可腌制的对象

7.1.4 不可腌制的对象并不是所有对象都是可腌制的。套接字、文件句柄、数据库连接以及其他运行时状态依赖于操作系统或其他进程的对象,其可能无法用一种有意义的方式保存。如果对象包含不可腌制的属性,则可以定义__getstate__()和__setstate__()来返回所腌制实例的状态的一个子集。1__getstate__()方法必须返回一个对象,其中包含所腌制对象的内部状态。表示状态的一种便利...

2019-03-25 20:15:22 84

转载 第七章:数据持久存储与交换-pickle:对象串行化-重构对象的问题

7.1.3 重构对象的问题处理定制类时,腌制的类必须出现在读取pickle的进程所在的命名空间里。只会腌制这个实例的数据,而不是类定义,类名用于查找构造函数,以便在解除腌制时创建新对象。下面这个例子将一个类的实例写至一个文件。import pickleimport sysclass SimpleObject: def __init__(self,name): s...

2019-03-24 09:12:13 99

转载 第七章:数据持久存储与交换-pickle:对象串行化-处理流

7.1.2 处理流除了dumps()和loads(),pickle还提供了一些便利函数来处理类似文件的流。可以向一个流写多个对象,然后从流读取这些对象,而无须事先知道要写多少个对象或者这些对象有多大。import ioimport pickleimport pprintclass SimpleObject: def __init__(self,name): s...

2019-03-24 08:51:36 177

转载 第七章:数据持久存储与交换-pickle:对象串行化-编码和解码字符串中的数据

第七章 数据持久存储与交换7.1 pickle:对象串行化pickle模块实现了一个算法可以将一个任意的Python对象转换为一系列字节。这个过程也被称为串行化对象。可以传输或存储表示对象的字节流,然后再重新构造来创建有相同性质的新对象。警告:pickle的文档明确指出它不提供任何安全保证。实际上,对数据解除腌制可以执行任意的代码。使用pickle完成进程间通信或数据存储时要当心,另外不要相...

2019-03-24 08:32:00 143

转载 第六章:文件系统-io:文本、十进制和原始流I/O工具-为文本数据包装字节流

6.11.2 为文本数据包装字节流元素字节流(如套接字)可以被包装为一个层来处理串编码和解码,从而可以更容易地用于处理文本数据。TextIOWrapper类支持读写。write_through参数会禁用缓冲,并且立即将写至包装器的所有数据刷新输出到底层缓冲区。import io# Write to a buffer.output = io.BytesIO()wrapper = io.T...

2019-03-23 09:45:52 76

转载 第六章:文件系统-io:文本、十进制和原始流I/O工具-内存中的流

6.11 io:文本、十进制和原始流I/O工具io模块在解释器的内置open()之上实现了一些类来完成基于文件的输入和输出操作。这些类得到了适当的分解,从而可以针对不同的用途重新组合——例如,支持向一个网络套接字写Unicode数据。6.11.1 内存中的流StringIO提供了一种很便利的方式,可以使用文件API(如read(),write()等)处理内存中的文本。有些情况下,与其他一些字...

2019-03-23 09:43:51 126

转载 第六章:文件系统-codecs:字符串编码和解码-定义定制编码

6.10.9 定义定制编码由于Python已经提供了大量标准codecs,所以应用一般不太可能需要定义定制的编码器或解码器。不过,如果确实有必要,codecs中的很多基类可以帮助你更容易地定义定制编码第一步是了解编码描述的转换性质。这一节中的例子将使用一个“invertcaps”编码,它把大写字母转换为小写,把小写字母转换为大写。下面是一个编码函数的简单定义,它会对输入字符串完成这个转换。im...

2019-03-22 23:14:30 609

转载 第六章:文件系统-codecs:字符串编码和解码-Unicode数据和网络通信

6.10.8 Unicode数据和网络通信不同于标准输入和输出流,网络套接字是字节流,默认情况下不支持编码。因此,如果程序希望通过网络发送或接收Unicode数据,那么在将数据写至一个套接字之前必须先将数据编码为字节。下例中的服务器会把接收到的数据回送给发送者。import sysimport socketserverclass Echo(socketserver.BaseRequest...

2019-03-21 20:02:36 199

转载 第六章:文件系统-codecs:字符串编码和解码-增量编码

6.10.7 增量编码目前提供的一些编码(特别是bz2和zlib)在处理数据流时可能会显著改变数据流的长度。对于大的数据集,这些编码采用增量方式可以更好地处理,即一次只处理一个小数据块。IncrementalEncoder/IncrementalDecoder API就是为此而设计的。import codecsimport sysfrom codecs_to_hex import to_...

2019-03-21 19:12:17 223

转载 第六章:文件系统-codecs:字符串编码和解码-非Unicode编码

6_10_6_非Unicode编码尽管之前多大多数例子都使用Unicode编码,但实际上codecs还可以用于很多其他数据转换。例如,Python包含了处理base-64,bzip2,ROT-13,ZIP和其他数据格式的codecs。import codecsimport iobuffer = io.StringIO()stream = codecs.getwriter('rot_13...

2019-03-21 18:49:18 216

转载 第六章:文件系统-codecs:字符串编码和解码-编码转换

6_10_5_编码转换尽管大多数应用都在内部处理str数据,将数据解码或编码作为I/O操作的一部分,但有些情况下,可能需要改变文件的编码而不继续坚持这种中间数据格式,这可能很有用。EncodedFile()取一个使用某种编码打开的文件句柄,用一个类包装这个文件句柄,有I/O操作时它会把数据转换为另一种编码。from codecs_to_hex import to_heximport cod...

2019-03-21 18:08:00 308

转载 第六章:文件系统-codecs:字符串编码和解码-错误处理-解码错误

6.10.4.2 解码错误数据解码时也有可能遇到错误,特别是如果使用了错误的编码。import codecsimport sysfrom codecs_to_hex import to_hexerror_handling = sys.argv[1]text = 'fráncais'print('Original :',repr(text))# Save the d...

2019-03-21 17:48:25 307

转载 第六章:文件系统-codecs:字符串编码和解码-错误处理-编码错误

6.10.4 错误处理前面几节指出,读写Unicode文件时需要知道所使用的编码。正确地设置编码很重要,这有两个原因:首先,如果读文件时未能正确地配置编码,就无法正确地解释数据,数据有可能被破坏或者无法解码;其次,并不是所有Unicode字符都可以用所有编码表示,所以如果写文件时使用了错误的编码,就会产生一个错误,可能丢失数据。类似于str的encode()方法和bytes的decode()方法...

2019-03-20 21:14:03 445

转载 第六章:文件系统-codecs:字符串编码和解码-字节序

6.10.3 字节序在不同计算机系统之间传输数据时(可能直接复制一个文件,或者使用网络通信来完成传输),多字节编码(如UTF-16和UTF-32)会带来一些问题。不同系统中使用的高字节和低字节的顺序不同。数据的这个特性被称为字节序(endianness),这取决于硬件体系结构等因素,还取决于操作系统和应用开发人员做出的选择。通常没有办法提前知道给定的一组数据要使用哪一个字节序,所以多字节编码还包...

2019-03-19 19:34:18 303

转载 第六章:文件系统-codecs:字符串编码和解码-处理文件

6.10.2 处理文件处理I/O操作时,编码和解码字符串尤其重要。不论是写至一个文件、套接字还是其他流,数据都必须使用适当的编码。一般来讲,所有文本数据在读取时都需要由其字节表示解码,写数据时则需要从内部值编码为一种特定的表示。程序可以显式地编码和解码数据,不过取决于所用的编码,要想确定是否已经读取足够的字节来充分解码数据,这可能并不容易。codecs提供了一些类来管理数据编码和解码,所以应用不...

2019-03-19 19:29:54 152

转载 第六章:文件系统-codecs:字符串编码和解码-Unicode入门

6.10 codecs:字符串编码和解码codecs模块提供了流接口和文件接口来完成文本数据不同表示之间的转换。通常用于处理Unicode文本,不过也提供了其他编码来满足其他用途。6.10.1 Unicode入门CPython 3.x区分了文本(text)和字节(byte)串。bytes实例使用一个8位字节值序列。与之不同,str串在内部作为一个Unicode码点(code point)序列...

2019-03-19 19:25:40 289

转载 第六章:文件系统-mmap:内存映射文件-正则表达式

6.9.3 正则表达式由于内存映射文件就类似于一个字符串,因此也常与其他处理字符串的模块一起使用。import mmapimport repattern = re.compile(rb'(\.\W+)?([^.]?rem[^.]*?\.)', re.DOTALL | re.IGNORECASE | re.MULTILINE)with open...

2019-03-18 19:00:02 139

转载 第六章:文件系统-mmap:内存映射文件-写文件

6.9.2 写文件要建立内存映射文件来接收更新,映射之前首先要使用模式’r+’(而不是’w’)打开文件以便完成追加。然后可以使用任何改变数据的API方法(例如write()或赋值到一个分片等)。下面的例子使用了默认访问模式ACCESS_WRITE,并赋值到一个分片,以原地修改某一行的一部分。import mmapimport shutil# Copy the example file....

2019-03-18 18:57:27 689

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除