有些时候,我们需要在终端使用表格的形式打印一些文字,如下图所示,怎么实现呢?

表格示意图

如果我们打印的是字母或者数字,那么其实比较简单,可以使用如下的python代码

print('{0:<40s}'.format('Big face.'))

但是如果字符串中包含中文,这样是不行的,因为中文一个字符实际上占用两个字符的空间。假设如下的代码变量中bus_station包含snostationname两个键,其中sno的值为数字,stationname的值为中文字符串。可以使用如下的代码实现打印不同的序号和站名占用相同的空间。

station_no = bus_station['sno']
station_name = bus_station['stationname']
output_station = '{0:<2d}: {1}'.format(station_no, station_name)

# 校正占位符
correct_space = 30 - len(station_name)
# 进一步校正,排除非汉字的情况
if 'S1' in station_name:
    correct_space = correct_space + 2

# 嵌套格式化
print(u'{1:<{0}s}'.format(correct_space, output_station), end="")

FDTD Solutions可以计算任意形状贵金属纳米颗粒的光学特性,其电场数据可以使用matlabsave方法导出,然后使用Python读取并画图。下面是一张3D的电场数据在Z方向上的某个切片。

三维数据

如果电场moinitor是三维的,那么通常还分为多波长和单波长的数据,对于多波长的数据,数据E的尺寸为[sx*sy*sz, 3, len(wavelengths)],对于单波长的,数据E的尺寸为[sx*sy*sz, 3],由于numpy和matlab对于行列不同的优先填充特性,导入的数据需要转置。

# f为h5py打开的文件对象
ME = f[keys[-1]]
E = np.array(ME['E']).transpose()

以多波长为例,电场的绝对值和最大值及其索引可以使用如下的方法处理,这里主要涉及到结构化数组(sturctured array)的处理。

Ex = np.abs(E[:, 0, :]['real']+1j*E[:, 0, :]['imag'])
Ey = np.abs(E[:, 1, :]['real']+1j*E[:, 1, :]['imag'])
Ez = np.abs(E[:, 2, :]['real']+1j*E[:, 2, :]['imag'])

Ea = np.sqrt(np.power(Ex, 2)+np.power(Ey, 2)+np.power(Ez, 2))
index = np.argmax(Ea)
[i, j] = np.unravel_index(index, (sizes[0], sizes[2]))
[m, n, k] = np.unravel_index(i, (sx, sy, sz))[::-1]

需要注意的是,对于matlab存储的数据,Python在reshape之后,需要转置

Ear = Ea[:, j].reshape((sx, sy, sz)).T
  • 第一张切片

第一张电场切片

  • 最大的切片

最大的电场切片

blender_chemicals

blender_chemicals (https://nino.coding.net/p/blender_chemicals/d/blender_chemicals/git) 是一个基于blender-chemicals1的插件,可以用来将SMILE格式的分子转换成3D的结构。但是由于Blender最新版的python的api和以往相差较多,因此blender-chemicals已经无法使用,会产生很多的错误。因此,我将blender-chemicals进行修改,并转换成适应最新Blender的一个插件,其界面如下图所示。

Screenshot of addon

安装支持软件

这个Blender插件对于smile格式的转换是基于Openbabel的,因此需要安装openbabel,但是这个软件的安装,非常容易出错,因此,推荐严格按照如下的方法进行安装。

  • 安装Anaconda2
  • 使用conda命令安装openbabel
conda install -c openbabel openbabel

安装完成之后,在python环境中执行如下的命令,看看是否出错,出错代表没有安装成功

import pybel
import openbabel

安装blender_chemicals

  • 下载blender_chemicals,并压缩成一个zip文件。
  • 在Blender中将这个zip文件安装一个插件的方式进行安装[Edit]-[Preferences]-[Addon] as below.

Install Addon

  • N 键展示插件的设置和输入面板。

支持

可以使用 https://cactus.nci.nih.gov/cgi-bin/osra/index.cgi 来创建或者转换SMILE格式

Git的Tag功能有助于使用一些特殊的标记将某些特定版本的提交标记出来,方便后边的使用。

Tags常见的操作

  • 列出本地标签
    git tag --list
    
  • 创建标签
    git tag -a v1.0.1 -m "创建v1.0.1"
    
  • 推送本地标记到远程
    git push origin v1.0.1
    
  • 删除本地标记
    git tag -d v1.0.1
    
  • 删除远程标记
    git push origin  :refs/tags/v1.0.1
    

创建发行版

此处以码云为例,如果创建了一个标签之后,则单击操作栏的创建发行版超链接,就可以创建一个发行版。

发行版示例图片

jekyll配合github的版本控制功能,使之成为非常流行的写作工具。通过Visual Studio Code结合Python可以使写作更加流畅。

  • 使用Python编写jekyll日志的生成工具,一个命令就可以创建一个Post文件,使我们可以专注写作的过程,可以参考如何使用python创建jekyll日志模板

  • 写作的过程难免会涉及到图片,由于github的服务器在国外,又多有限制,图片的传输比较慢。解决github上传图片慢的问题,可以使用国内比如腾讯云,阿里云的对象存储来存储图片。由于存储过程涉及复制、粘贴还有图片的压缩操作,那么结合这些对象存储供应商的sdk,编写python工具,并结合注册表,制作一个右键菜单,使得可以通过右键菜单,完成图片的压缩,上传,返回markdown代码的操作。