有没有简单的方法可以列出,排序和保存目录到字符串?

时间:2018-11-07 18:01:40

标签: python

我在当前工作目录中模拟了这样的目录:

WorkDirectory/500kstp 
WorkDirectory/1mstp 
WorkDirectory/1.5mstp 
.... 
WorkDirectory/20mstp

我希望数组的元素具有如下值:

dirs[0]='500kstp'
dirs[1]='1mstp'
dirs[2]='1.5mstp'
dirs[3]='2mstp'
dirs[4]='2.5mstp'
....
dirs[19]='20mstp'

我正在学习Python。我注意到如果要列出,排序和重新排列目录,Python脚本会很复杂。如果使用Perl,下面显示的四个命令可以实现它。

my $line=`ls|grep stp|sort -n`;chomp($line);
my @dirs=split(/\r?\n/,$line);
$_=pop(@dirs);
unshift(@dirs,$_);

但是,在python中,它看起来非常复杂,因为Python必须调用某些复杂的模块。有什么简单的方法可以调用Bash脚本将输出保存到字符串中?

1 个答案:

答案 0 :(得分:1)

要获取目录的内容并查找包含特定字符串的条目,可以执行以下操作:

dirs = [f for f in os.listdir('.') if 'stp' in f]

如果要按字符串排序,则可以:

dirs = sorted(f for f in os.listdir('.') if 'stp' in f)

要将条目按数字排序,可以执行以下操作:

def numericKey(s):
    m = re.search('([^\d]*)(\d+(?:\.\d+)?)(.*)', s)
    if m:
        return m.group(1), float(m.group(2)), m.group(3)
    else:
        return (s,)
dirs = sorted((f for f in os.listdir('.') if 'stp' in f), key=numericKey)

编辑: 按其他地方指出的那样按k和m缩放数字,您可以执行以下操作:

import os, re
def numericKey(s):
    m = re.search('([^\d]*)(\d+(?:\.\d+)?)([mk]?)(.*)', s)
    if m:
        scale = dict(m=1e6, k=1e3).get(m.group(3), 1)
        return m.group(1), float(m.group(2))*scale, m.group(4)
    else:
        return (s,)
dirs = sorted((f for f in os.listdir('.') if 'stp' in f), key=numericKey)