在使用 Python 进行数据库查询,通常情况下cursor的fetchall,fetchmany返回的是元组(Tuple) 的列表,所以对查询到的结果只能用索引下标来访问,而无法通过字段名来获取值。对 Java JDBC 的 ResultSet 操作,我们有两种获取值的方式,resultSet.getString(1) 和 resultSet.getString('name')。
其实只要能用数字索引访问到字段值也就足够了,查询后字段名可以由cursor.description获得。通过字段名来访问值唯一的好处估计是出错的概率小些罢了,比如 result['firstname'], result['lastname'] 总是比 result[1], result[2] 更不容易搞混,错误定位也会更轻松。
假如有下面的数据库表与两条记录 Read More
作为一个 Java 为母语的程序员来讲,学习起其他新的语言就难免任何事都与 Java 进行横向对比。Java 7 引入了能省去许多重复代码的
try-with-resources特性,不用每回 try/finally 来释放资源(不便之处有局部变量必须声明在 try 之前,finally 里还要嵌套 try/catch 来处理异常)。比如下面的 Java 代码1try(InputStream inputStream = new FileInputStream("abc.txt")) { 2 System.out.println(inputStream.read()); 3} catch (Exception ex) { 4}它相应的不使用 try-with-resources 语法的代码就是 Read More

上一篇 Python 的模块搜索路径,介绍了 Python 的模块搜索路径,最终起作用的是
sys.path路径列表。如果要自定义自己的搜索路径,就是要怎么定制sys.path的内容。可以简单的用PYTHONPATH环境变量前向添加,这儿将要说的是用.pth文件的方式。也可由此进一步理解 Python 依赖管理工具,像virtualenv等的工作原理。.pth文件名是什么,无所谓,Python 只认扩展名。.pth文件中每行指定一个路径 -- 绝对或相对路径(相对于本.pth文件所在的目录),另外还可以空行或#开始的注释行,还能有import语句,大概只用来校验是否能导入成功,程序代码中还是需要显示的 import 模块。.pth文件放在哪里.pth文件创建好后应该放到哪里去呢?不是sys.prefix指示的位置,也不是sys.path中任意一个目录,而是sys.path中属于 site.packages 的某一个目录中。可以用1>>> import site 2>>> site.getusersitepackages() 3>>> site.getsitepackages()查看到, 看我在 Ubuntu Linux 中看到的内容(为便于阅读,显示列表内容时进行了换行处理) Read More

一种语言要使用到外部库(模块) 时必然会涉及到从哪里以及按何顺序加载依赖,就像 LD_LIBRARY_PATH, CLASSPATH 那样,Python 也有其默认的模块搜索顺序, 依序找到想要的模块即停止。Python 中
sys.path返回的列表包含了模块搜索的顺序,我们可以程序中修改该列表,或用PYTHONPATH环境变量前插路径,甚至是用.pth文件来附加路径。简单的,可以执行命令
python3 -c "import sys; print(str(sys.path).replace(',', '\n'))"来查看 python3 交互 shell 下的模块搜索路径,类似结果如下:[''
'/usr/lib/python36.zip'
'/usr/lib/python3.6'
'/usr/lib/python3.6/lib-dynload'
'/home/yanbin/.local/lib/python3.6/site-packages'
'/usr/local/lib/python3.6/dist-packages'
'/usr/lib/python3/dist-packages'
'/usr/lib/python3.6/dist-packages']注意,第一个元素是个空字符串,代表进入 python3 shell 时的当前目录。
如果在通过一个 py 脚本文件来打印
sys.path的话显示稍微有所差异。比如在目录/home/yanbin/Developers/下创建test.py文件,内容为 Read More
阅读到 Strings 中关于转换对象为字符串的内容,介绍了
repr函数,趁着还没有真正了解 Python 面向对象的生疏与热度,感性上理解一下repr与str这两个函数的区别。Python 的全局方法
repr和str会映射到对象的__repr__和__str__的方法调用,还有str(obj)时会调用哪个方法,以及print(obj)和调试 Python 代码时的对象显示会调用哪个方法呢?这就是本文想要印证的内容。恰如 Java 的
System.out.println(obj)或"hello" + obj都会调用 Java 对象的toString()方法,那么 Python 中是怎么一回事呢?来自某本 Python 入门书的解释
repr和str:repr: formal string representation of a Python objectstr: informal string representation of a Python object,或者说 printable string representation
首先
repr是 representation 的意思,一个是正式,另一个是非正式,看起来repr比str显得重要些。 Read More
Web 程序我还是喜欢用 Apache 来作为入口,因为我用的系统是 Mac OS, Apache 它就静静的躺上那儿了。最好是都像 PHP 那样的程序,无需启动额外的服务,这种使用方式的缺陷是不太适合于做微服务。
这儿呢,我也是来探索如何在 Apache 中运行 Python 的 CGI 程序,这主要是涉及了 Apache 与 Python 的集成。集成方式有直接集成(mod_python),CGI,FastCGI, WSGI 和 uWSGI。本文主要是讲如何运行一个简单的 Python CGI。
直接集成(mod_python)
虽然由于多方面的安全因素,这已经成为历史了,但还是提一下。参见
- Apache HTTP Server/mod_python(它推荐使用 mod_wsgi, 以下该节相关内容摘在本链接,没有亲自尝试)
- mod_python 官网(最后的更新是 2013-11-13)
需要安装模块 mod_python.so,并在
httpd.conf加上相关的配置 Read More
两年前想摸摸 Python 的门道,简要记录了一篇 我的 Python 快速入门,当时只觉得那是一种与 C/Java 异样风格的编程语言,没领会到特别之处。如今对 Python 的感受就不一般了,因为是云服务,机器学习,人工知道大行其道的年代,所以更为急迫的想把它好好弄明白。
Python 3 说是设计的比 Python 2 要合理的多,所以没有保持向后兼容,现在初学 Python 对于选择哪个版本的 Python 时没有任何犹豫了,当然拣最新的 Python 3 学了。因此各种命令行工具都得用有 3 标记的,如
python3,pip3,pydoc3。编程语言特别是脚本语言,简单验证或入门最需要一个
REPL工具,这里不论大型项目时最好选择全功能型的 IDE,像 PyCharm 这样的重型武器。在安装 Python 3 后,它自带了两个,分别是python3和idle3(据说是 Integrated DeveLopment Environment 的缩写词, 可没见这么简陋的 IDE)Python
命令
python3进到控制台的 Python 交互界面,Python 标准的>>>提示符。没有语法高亮,没有自动缩进,唯一高级点的功能就是tab能对变量可以方法,属性的自动完成。 Read More- 最近转战到 Amazon 的云服务 AWS 上,考虑到在使用它的 Lambda 服务时 Python 应用有比较可观的启动速度,与之相比而言,Java 总是慢热型,还是一个内存大户。所以有想法 Lambda 函数用 Python 来写,来增强响应速度,而内部的应用仍然采用 Java, 于是就有了 Java 与 Python 的数据交换格式。使用 Kafka 的时候是用的 Apache Avro, 因此继续考察它。
注意,本文的内容会有很大部份与前一篇 Apache Avro 序列化与反序列化 (Java 实现) 雷同,不过再经一次的了应用,了解更深了。
在不同类型语言间进行数据交换,很容易会想到用 JSON 格式,那我们为什么还要用 Apache Avro 呢?通过接下来的内容,我们可以看到以下几点:- Apache Avro 序列化的格式也是 JSON 的,Java 的 Avro 库依赖于 Jackson 库
- 序列化数据库本身带有 Schema 定义的,方便于反序列化,特别是对于 Java 代码; 而 JavaScript 会表示多此一举
- 自动支持序列化数据的压缩,在官方提供的库中,Java 可支持
deflate,snappy,bzip2, 和xz. 其他语言中可能少些,如 Python 只支持deflate, 和snappy, 应该可扩充。序列化数据中 Schema 部分不被压缩 - 天然支持序列化对象列表,这样在序列化数据中只需要一份 Schema,类似于数据库表 Schema 加上多记录行的表示方式。只用 Apache Avro 传输小对象的话,数据量比 JSON 事 JDK 序列化的数据要大。
Apache Avro 官方提供有 C, C++, C#, Java, PHP, Python 和 Ruby 的支持库,可在网上找到其他语种的类库,如 NodeJS, Go 的,等等。 Read More
本文只是我个人的掌握 Python 的快速入门笔记, 所以混乱不堪, 并不适合于每一个想要学习 Python 的读者
Python 命令进到它的 shell, ctrl+d 或 exit() 退出 python. help(str) 可以查看 str 函数的帮助, q 退出帮助. 对象的方法可用 dir 来查看,dir([]),dir(""), 进而help([].append),help(dir([]))
Python 是用严格的缩进来格式化代码块的, Google 的 Python 代码规范是用 4 个空格来缩进. Google 建议 Java 是用两个空格.
Python 是动态类型的, 所以可以 a = 1; a = "string" 随意赋值为不同类型. Python 也能用分号把多条语句写在同一行里, 但基本没人用分号的.
Python 的基本类型有 整数, 长整数, 浮点数和复数, 以及字符串
字符串可以用单引号和双引号, 它们像 Javascript, 是完全一样的
''' 或 "”” 三引号的字符串是 here doc, 多行字符串
转义符也是用 \, 如 ''What\’s your name\n?
自然字符串: 即不转义, 用 R 或 r 来指定, 如 r"Newlines are indicated by \n”, 会输出 "\n"" 字面值. 可用于书写正则表达式
放在一起的字符串就会被 Python 自动连接, 如 print ''What\'s' ''your name?’, 输出为 "What’s your name?”
Python 的命名规则有几个必须知道的: 类名和 Java 一样; 模块, 方法, 变量名用小写字母下划线分隔, 常量用大写加下划线. 单或双下划线开头是特殊用途. 命名规则请参考 Google Python Style Guide#Naming
Python 是纯面向对象的, 任何东西都是对象, 函数也是
Python 可以用 \ 来连接语句行, 像 Bash 一样, 如 Read More