0%

import module后,可以使用module.__file__查看模块源文件所在路径,dir(module)查看模块导出的符号 — Python

python里没有递增运算符++和递减运算符--,还好可以使用+=-=运算符。

Python的条件表达式或叫三元操作符与其他语言有很大的不同,其格式为: result_while_condition_is_true if condition else result_while_condition_is_false,如果condition为True,整个条件表达式的值为result_while_condition_is_true,否则整个条件表达式的值为result_while_condition_is_false

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- ArithmeticError
+-- FloatingPointError
+-- OverflowError
+-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- LookupError
+-- IndexError
+-- KeyError
+-- MemoryError
+-- NameError
+-- UnboundLocalError
+-- OSError
+-- BlockingIOError
+-- ChildProcessError
+-- ConnectionError
+-- BrokenPipeError
+-- ConnectionAbortedError
+-- ConnectionRefusedError
+-- ConnectionResetError
+-- FileExistsError
+-- FileNotFoundError
+-- InterruptedError
+-- IsADirectoryError
+-- NotADirectoryError
+-- PermissionError
+-- ProcessLookupError
+-- TimeoutError
+-- ReferenceError
+-- RuntimeError
+-- NotImplementedError
+-- SyntaxError
+-- IndentationError
+-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
+-- UnicodeError
+-- UnicodeDecodeError
+-- UnicodeEncodeError
+-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning

===
[erq]

首先使用brew安装unixodbc和mdbtools,unixodbc是odbc驱动管理器,mdbtools提供了一组mdb操作工具,更重要的是mdbtools提供了mdb驱动程序。

1
2
$ brew install unixodbc
$ brew install mdbtools

但是安装完成后发现/usr/local/lib目录中没有mdbtools驱动动态链接库libmdbodbc.dylib
查看mdbtools选项可以发现:

1
2
3
$ brew options mdbtools
--with-man-pages
Build manual pages

mdbtools formula并没有提供--with-unixodbc选项,默认也没有build mdb驱动,因此需要手动来编译安装mdbtools提供的mdb driver

编译安装libmdbodbc
brew安装mdbtools时已经将mdbtools的源码包下载到了目录/Library/Caches/Homebrew/,所以直接使用这个源码包编译安装就可以了。

1
2
3
4
5
6
7
$ tar zxvf mdbtools-0.7.1
$ cd mdbtools-0.7.1
$ autoreconf -i -f
$ ./configure --with-unixodbc=/usr/local --disable-man
$ make
$ cd src/odbc
$ sudo make install

这样libmdbodbc驱动程序就安装到了/usr/local/lib目录下。libmdbodbc的源代码就在src/odbc目录下。

配置unixodbc

因为brew的所有包都安装在/usr/local下面,因此这里配置unixodbc应该使用/usr/local/etc/目录下的odbcinst.ini和odbc.ini文件。
odbcinst.ini配置如下:

1
2
3
4
5
6
\[MDBTools\]
Description=MDBTools Driver
Driver=libmdbodbc.dylib
Setup=libmdbodbc.dylib
FileUsage=1
UsageCount=1

然后就可以像linux平台上一样来访问mdb文件了。

1
2
3
$ python3
>>> import pypyodbc
>>> conn=pypyodbc.connect('Driver=MDBTools;DBQ=/path/to/record.mdb')

因为这里也是使用mdbtools提供的odbc驱动,所以和pypyodbc配合使用时仍然存在中文字符编码转换的问题,和linux平台上一样处理即可。

===
[erq]

当前1.3.3版本的pypyodbc在linux系统上面已经可以读取有中文字符的mdb文件,不再出现异常,但是读取的中文字符却全是乱码。

下面是根据一些现象的合理推论:
mdb文件来自于windows系统,其中的中文字符使用GB编码无疑,但linux系统上mdbtools提供的odbc驱动底层已经执行了编码转换,将GB码转换为unicode码,pypyodbc再一次进行转换所以出现了问题。

pypyodbc.connect函数有一个参数unicode_results,在python3版本上默认为True,也就是返回unicode编码的结果集。
odbc底层驱动转换一次编码,pypyodbc再转换一次,悲剧不可避免的出现了。

因此设定connect函数的unicode_results为False,也就是原样返回结果集,然后结果集中的字段名和字段值都需要解码为unicode字符串:

1
2
3
$ python3
>>> conn=pypyodbc.connect('Driver=MDBTools;DBQ=/path/to/Record.mdb', unicode_results=False)
>>> conn.cursor().execute('SELECT * FROM Build').fetchone()\[0\].decode('UTF-8')

decode(‘UTF-8’)解码成功,说明mdbtools的odbc驱动返回的结果集已经是unicode编码格式。

===
[erq]

发现一个靠谱的python tkinter可视化界面设计器,page,仍在活跃开发,支持python 2.7和3.2, 经测最新的python 3.4也没问题。

下载后,解压执行page.tcl即可,不要执行page。

不过page.tcl需要做小小的修改,最前面三行修改为如下行:

1
2
3
#!/bin/sh
# the next line restarts using wish\\
exec wish "$0" "$@"

使用方法很简单,添加一个toplevel,然后拖拉组件,设置组件的属性,最后生成py模块,然后再添加事件处理函数就差不多了。

===
[erq]

textContent

innertText和textContent都是用于获取节点及其后代节点的文本内容。innerText是M$的专有API,不过除firefox外基本上其他浏览器都支持此属性。textContent则是W3C的标准API。

innerText和textContent的主要区别如下:

  • textContent可以获取所有元素的内容,包括