给我一个Terminal,我可以创造一个世界。
给我一台windows,我只能活在盖茨的世界里。
环境win7 64bit,python2.7,怎么安装.whl的拓展包呢?什么环境变量,pip的都不用管了,只需要cmd下一句话,
python -m pip install ***********.whl
就可以啦
2016年5月30日星期一
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,格式如下,
在production的secret_key_base下补充上我们的密钥。这里暂时忽略development和test,我们是应用,不是二次开发,哈哈
这里的复制粘贴不是那么友好,我们也可以这样来省事儿,
保存退出,重启服务,我这么懒直接重启的服务器。
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
万能的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结束语句就好啦!
一次多么絮絮叨叨又二逼的简单错误。
这次是这样的,比较两个规模比较大的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结束语句就好啦!
一次多么絮絮叨叨又二逼的简单错误。
订阅:
博文 (Atom)