【问题标题】:converting strings to literal directories将字符串转换为文字目录
【发布时间】:2016-04-05 06:29:12
【问题描述】:

使用 iPython,我试图遍历目录中的所有文本文件,对每个文本文件执行一些操作(在以“BEGIN”开头的行之后裁剪一部分文本文件),然后将结果保存到另一个临时文件.txt。但是,当我执行!cat file_path 时,它不会将file_path 作为目录,而是将其解释为名为@9​​87654323@ 的字符串。无论如何,我可以将字符串 file_path 转换为 !cat 可以使用的文字目录吗?

import os
for fn in os.listdir('./dir'):
     if fn.endswith('.txt'):
        file_path='./dir'+fn
        print "file path is:", file_path
        !cat file_path | sed -e '1,/BEGIN/d'>temp.txt

输出:

file path is: ~/Documents/dir/doc.txt
cat: file_path: No such file or directory

【问题讨论】:

  • 据我所知,您不能只插入!cat 来转义并执行shell 命令。你必须使用subprocess.Popen 或类似的东西。为什么不直接使用 python 进行裁剪,或者全部在 shell 中完成,而不是尝试以这种方式混合它们? (这也有“无用的 cat”)这是 IPython,这就是 ! 起作用的原因吗?你可能不想要/Documents 但我猜是~/Documents
  • 我发现这种混合方式更干净。但是,是的,仅在 Python/Unix 中就可以做到这一点。是的,这是 iPython,可以在任何时候使用 !字符,正确的目录是 ~/Documents。
  • 可以加标签IPython

标签: python unix ipython cat


【解决方案1】:

您必须将file_path 括在大括号中以将其标记为 Python 表达式。试试这个作为脚本的最后一行:

!cat {file_path} | sed -e '1,/BEGIN/d'>temp.txt

【讨论】:

  • @Peyman 很高兴我能帮上忙!随意通过单击复选标记将我的答案标记为已接受,这样我就可以获得那些甜蜜的声誉点:)
【解决方案2】:

以我的拙见,您忘记在 file_path 变量中添加“/”:

import os
for fn in os.listdir('./dir'):
    if fn.endswith('.txt'):
        file_path='./dir/'+fn
        print file_path

顺便说一下,在这种情况下你可以使用 bash:

for i in `ls ./dir`; do if [[ $i == d*.txt ]]; then cat ./dir/$i | sed -e '1,/BEGIN/d'>temp.txt ; fi; done

【讨论】:

  • 缺少 f / 很好,因为我将它包含在 dir 本身中。我还想使用 Python 和 Bash 的组合,因为需要我在这里没有包含的其余代码:)
猜你喜欢
  • 2012-02-22
  • 1970-01-01
  • 2015-03-20
  • 2013-05-04
  • 1970-01-01
  • 2019-10-10
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多