遍历文件目录作为模块的输入

时间:2019-02-22 19:26:18

标签: python ipython jupyter

我有一个要在目录中的每个文件上运行的模块。但是,当我使用每个文件作为输入遍历该目录时,模块找不到该文件,好像循环中定义的变量实际上并未指向该文件。这是我要执行的代码:

import os as os

for file in os.listdir():
    if file.endswith('.fasta'):   
        !python ../iupred2a.py file long

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

https://ipython.readthedocs.io/en/stable/interactive/reference.html#system-shell-access说,shell命令(例如,以“!”为前缀的行)是按字面意义解释的。当您键入“文件”时,它会看到“文件”,而不是file变量的值。

  

任何以!开头的输入行字符逐字传递(当然要减去!)到底层操作系统。

但是它也说您可以使用花括号或美元符号来“扩展”一个值。

  

IPython还允许您在进行系统调用时扩展python变量的值。将变量或表达式包装在{大括号}中:

In [1]: pyvar = 'Hello world'
In [2]: !echo "A python variable: {pyvar}"
A python variable: Hello world
In [3]: import math
In [4]: x = 8
In [5]: !echo {math.factorial(x)}
40320
  

对于简单的情况,您可以在$前面加上变量名:

In [6]: !echo $sys.argv
[/home/fperez/usr/bin/ipython]
In [7]: !echo "A system variable: $$HOME"  # Use $$ for literal $
A system variable: /home/fperez

根据您的情况,尝试使用!python ../iupred2a.py $file long!python ../iupred2a.py {file} long


...总而言之,我认为最好import您的另一个Python文件并直接调用其函数。这可能需要进行一些重新设计,因为importing from a file from one directory up有点棘手,并且模块的命令行界面通常不同于其编程界面。

如果您可以将当前文件和iupred2a.py放入同一目录中,并弄清楚您实际要调用的函数的名称,那么您的代码最终将看起来像这样:

import os
import iupred2a as iup

for file in os.listdir():
    if file.endswith('.fasta'):   
        iup.do_the_thing(file, mode="long")