【问题标题】:Creating a list in python using os.popen使用 os.popen 在 python 中创建列表
【发布时间】:2020-01-07 03:19:13
【问题描述】:

以前,我可以使用类似于以下的命令创建列表:

os.popen('ls *.fits > samplelist')

现在我正在尝试通过按数字对文件进行分组来将文件组织成列表。

文件命名如下:

Name_0000_J.fits、Name_0001_J.fits、Name_0002_J.fits 等

我尝试运行这行代码,但它只是创建列表 skylist_J_1 并将其留空。

os.popen('for num in {0000..0089} ; do ls Name_$num\_J.fits >> skylist_J_1 ; done')

我在命令行中运行了上述内容,它运行良好。任何见解将不胜感激。

编辑:

我想出了这个解决方案,但它相当笨重。希望有一种更简洁的方法来实现这一点。

def MkSkylist(qmin,qmax,name,band,quadrant):

    a = qmax-qmin+1

    ran = np.arange(qmin,qmax+1)
    num = [0]*a

    i = 0
    while i < a:
        num[i] = np.array2string(ran[i]).zfill(4)
        i = i + 1    

    os.popen('ls '+name+num[0]+'_'+band+'.fits > skylist_'+band+'_'+quadrant)

    i = 1
    while i < a:
        os.popen('ls '+name+num[0]+'_'+band+'.fits >> skylist_'+band+'_'+quadrant)
        i = i + 1

【问题讨论】:

  • 为什么不用os.popen 不用Python 编写它。或将其放入文件并运行os.popen("filename")
  • 您的问题并不是真正的 Python 问题,而更像是bash 问题,因为您没有在 Python 中解决问题。但是,问题可能是由您声明中的反斜杠引起的。不过,您确实应该研究 pathlib,例如:docs.python.org/3/library/pathlib.html#pathlib.Path.glob - 主要原因是编写一些不依赖于运行脚本的特定 shell 并且具有跨操作系统工作的脚本的东西。
  • 我认为这确实是一个 Python 问题:在 shell 中我们可以编写 for num in {2..4}; do echo $num; done(打印 3 行:234)。但是使用os.popensubprocess.Popen 会打印一行:{2..4}。所以问题是关于如何在 Python 中实现编写一个 bash-for 循环。

标签: python popen


【解决方案1】:

问题似乎与 for 循环的语法有关:即使该语法在 bash 中有效,但 Python 似乎不喜欢它。甚至没有subprocess.Popen(..., shell=True)

所以,尝试改用seq

os.popen("for num in $(seq 0 89); do printf "Name_%04dJ.fits\n" $num >> skylist_J_1; done");

这会生成一个文件skylist_J_1,内容如下:

Name_0001J.fits
Name_0002J.fits
Name_0003J.fits
Name_0004J.fits
...
Name_0086J.fits
Name_0087J.fits
Name_0088J.fits
Name_0089J.fits

还请注意,您可以将文件重定向放在外面,这与您的第一个示例更相似(使用&gt; 而不是&gt;&gt;):

os.popen('for num in $(seq 0 89); do printf "Name_%04dJ.fits\n" $num; done > skylist_J_1')

【讨论】:

  • 这里你可以看到为什么其他语法不起作用的解释:stackoverflow.com/questions/59622318/… 总之,os.popen 使用 /bin/sh,在你的系统中是一个不支持的 shell该语法{X..Y}
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
相关资源
最近更新 更多