2016年5月30日星期一

windows下为python安装*.whl

给我一个Terminal,我可以创造一个世界。

给我一台windows,我只能活在盖茨的世界里。

环境win7 64bit,python2.7,怎么安装.whl的拓展包呢?什么环境变量,pip的都不用管了,只需要cmd下一句话,

python -m pip install ***********.whl


就可以啦

2016年5月9日星期一

python遍历文件夹小结

下面来小结一下Python遍历文件夹的几种方法。

方法1:使用os.listdir
import os
for filename in os.listdir('c:\windows'):
    print filename

本结果直接输出当前根目录下的所有名字,即文件夹名和文件名,并没有进入子文件夹,同时并不包括文件路径,格式如下,

dsdkljsalkdjsalk.txt
ndskdkewjdkj.doc
folder1
folder2

- 对于想输出特定目录下的文件名/文件夹名,可以再加入条件判断,

os.path.isfile(root+filename)
os.path.isdir(root+filename)

这样加以筛选就可以只输出当前路径下所有文件名,或者当前路径下所有文件夹名。

- 如果你想按照特定顺序排列,如modified或者created time,需对当前排序。

假定当前的所有文件名都存在在某list1内,形如,

    for filename in os.listdir(folder):
        if(os.path.isfile(folder+filename)):
            list1.append(os.path.join(folder, filename))

    sorted_list1 =  sorted(matches, key=os.path.getmtime)

只需在sorted里加入key即可,这里的key是os.path.getmtime,文件的更改时间,
os.path.getatime是最近访问时间,os.path.getctime是创建时间。

*注意,这里的list1中os.path.join()方法用于组建新的路径名,我们除了filename,还加入了这些文件的当前路径。这里的folder路径不能去掉,否则笨蛋的程序凭借光杆文件名不会定位到我们的文件位置。

- 问题又来了,我们得到的经过排序的sorted_list1里还包含了路径名,这样大煞风景,怎么办呢?  用split!

    for name in sorted_matches:
        name_complet.append(name.split("/")[-1])

这里巧妙地割出-1个“/”的字符串,即左起第一个“/”前的字段,就是我们的完整文件名啦。

 
方法2:使用glob模块,可以设置文件过滤

import glob
for filename in glob.glob('c:\windows\*.exe'):
    print filename

本方法很方便筛选特定格式的文件。
 

方法3:通过os.path.walk递归遍历,可以访问子文件夹

import os.path
def processDirectory ( args, dirname, filenames ):
    print 'Directory',dirname
    for filename in filenames:
        print ' File',filename
 
os.path.walk('c:\windows', processDirectory, None )

这是使用最多的方法,可以递归进入子文件夹,从而实现某目录所有文件遍历的效果。
 
方法4:非递归

#!/bin/python
#
#site:www.jbxue.com
import os
for dirpath, dirnames, filenames in os.walk('c:\\winnt'):
    print 'Directory', dirpath
    for filename in filenames:
        print ' File', filename



2016年4月28日星期四

Rails app redmine 出现“Incomplete response received from application” 问题

搭建好的Redmine服务器,才运转两天就出问题,project里new issue的时候蹦出“Incomplete response received from application”的错误网页。真是费脑子啊。

万能的stackflow告诉我这是rails常见的错误,核心问题是secret token没配置好。这是rails应用经常出现的问题,故本文对rails应用有普适性。

缺少了production所必须的secret token, 那就生成好了。在这里,先说下它是干嘛的,

This step generates a random key used by Rails to encode cookies storing session data thus preventing their tampering.
Generating a new secret token invalidates all existing sessions after restart.

得当当前应用会话(标签页)重启/关闭的,secret token是用来解析cookies来防止随便访问和随便篡改的,验证通过,我才能对服务器里的数据修改(增减,在这里对应的是project/issue的新建)

说说解决方案,

1. 服务器上定位到我们的rails应用redmine文件夹,rake secret生成密钥

2. redmine/config 文件夹下新建secret.yml,格式如下,

development:
  secret_key_base:
 
test:
  secret_key_base:
 
production:
  secret_key_base: **********************************


在production的secret_key_base下补充上我们的密钥。这里暂时忽略development和test,我们是应用,不是二次开发,哈哈

这里的复制粘贴不是那么友好,我们也可以这样来省事儿,

development:
  secret_key_base:
 
test:
  secret_key_base:
 
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

保存退出,重启服务,我这么懒直接重启的服务器。

bug不见啦。

References,
1. http://stackoverflow.com/questions/29241053/incomplete-response-received-from-application-from-nginx-passenger
2. http://guides.rubyonrails.org/upgrading_ruby_on_rails.html#config-secrets-yml

2016年4月27日星期三

解决一次python报错ValueError: list.remove(x): x not in list的问题

公司里勤劳帅气却老是走神的小周同志又来了!

这次是这样的,比较两个规模比较大的List A和B, A中的元素e1前几个字符跟B中的元素e2前几个字符(形如thesamewords_______)匹配的话,输出e1到一新的List,同时对A和B进行更新(删除)。注意重复的情况。

思路很简单喽,两层for循环,匹配字符串前N位,if语句判断是否匹配,匹配的话加入新的list同时更新原来的List。简单写的代码如下,


l1 = ['aaaaaad', 'COFREP-B00000390-2015-05-SLCRXX-00-L-N--.zip', 'c', 'd']
l2 = ['aaaaaac', 'sada', 'dadada', 'da', 'di']
for e1 in l1:
    for e2 in l2:
        if e1[:6] == e2[:6]:
            l1.remove(e1)
            l2.remove(e2)
            l3.append(e1)
print l1
print l2

print l3

结果很理想,如下,

['COFREP-B00000390-2015-05-SLCRXX-00-L-N--.zip', 'c', 'd']
['sada', 'dadada', 'da', 'di']
['aaaaaad']

[Finished in 0.1s]

小测试完毕,更新list数据源,重新运行,就报错啦,唯一有用的一行是,
ValueError: list.remove(x): x not in list

测试多组数据,还是没有解决,跟HR美女姐姐吃饭去了。重点是,吃完饭回来,短短几分钟就找到了bug所在,到底还是美女的力量大!

说说我是怎么测试找出来的吧——————控制变量法,小学就学过的,

保持l1不变,更改l2的数据。简例中匹配的是aaaaaa___,因此l2中的aaaaaac被删除了,l1中的aaaaaad也被删除了,l3中有了aaaaaad。当l2 =  ['aaaaaac', 'aaaaaae', 'sada', 'dadada', 'da', 'di']时,即出现第二个aaaaaa___时,如上的错误再次出现了!兴奋!

用脚指头想象一下,l1[0]匹配到l2[0]的时候,分别对其执行remove(e1)和remove(e2)操作(l1[0]和l2[0]都被删除了),但是此时第二层loop还没有结束,又匹配到了l2[1](aaaaaae),此时会再次对l1执行操作remove(e1),一个完美的扑空!l1中已经没有删掉的e1了,因此报错。

To solve this bug, just one finger! may be five,

break

在if层末尾加上break结束语句就好啦!

一次多么絮絮叨叨又二逼的简单错误。