首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyError脚本中用于生成Bash脚本的

KeyError脚本中用于生成Bash脚本的
EN

Stack Overflow用户
提问于 2017-11-30 15:59:01
回答 2查看 816关注 0票数 0

我有一个名为renaming.py的Python脚本,我想使用它来生成许多Bash脚本(超过500个)。Python脚本如下所示:

代码语言:javascript
复制
#!/usr/bin/python

#Script to make multiple Bash scripts based on a .txt file with names of files
#The .txt file contains names of files, one name per line
#The .txt file must be passed as an argument.

import os
import sys

script_tpl="""#!/bin/bash
#BSUB -J "renaming_{line}"
#BSUB -e /scratch/username/renaming_SNPs/renaming_{line}.err
#BSUB -o /scratch/username/renaming_SNPs/renaming_{line}.out
#BSUB -n 8
#BSUB -R "span[ptile=4]"
#BSUB -q normal
#BSUB -P DBCDOBZAK
#BSUB -W 168:00

cd /scratch/username/renaming_SNPs

awk '{sub(/.*/,$1 "_" $3,$2)} 1' {file}.gen > {file}.renamed.gen

"""

with open(sys.argv[1],'r') as f:
    for line in f:
        line = line.strip()
        if not line:
            continue
        line = line.strip(".gen")
        script = script_tpl.format(line=line)
        with open('renaming_{}.sh'.format(line), 'w') as output:
            output.write(script)

作为参数传递给这个Python脚本的.txt文件如下所示:

代码语言:javascript
复制
chr10.10.merged.no_unwanted.formatted.gen
chr10.11.merged.no_unwanted.formatted.gen
chr10.12.merged.no_unwanted.formatted.gen
chr10.13.merged.no_unwanted.formatted.gen
chr10.14.merged.no_unwanted.formatted.gen
chr10.15.merged.no_unwanted.formatted.gen
etc

运行Python脚本时,会收到以下错误消息:

代码语言:javascript
复制
Traceback (most recent call last):
  File "renaming.py", line 33, in <module>
    script = script_tpl.format(line=line)
KeyError: 'sub(/'

我不完全确定发生了什么,但我认为

  • 第33行出了问题--不知道问题出在哪里。我以前也使用过类似的脚本。在这第33行中,我将script_tpl中的所有{ line }实例替换为.txt文件中的条目(对于.txt文件的每一行都会发生500次)。
  • 我被KeyError弄糊涂了。我正在Linux服务器上工作(使用Mac笔记本电脑)。我已经成功地使用了这个awk命令,在将它直接输入到终端时没有问题(作为一个Bash命令)。然而,当我试图将Python作为一个变量在脚本中“打印”时,Python可能会感到困惑。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-30 16:07:40

使用.format时,字符串中的所有{ }都将调用字符串格式。因为您在awk命令中使用了这些字符,所以必须将它们转义。要做到这一点,您需要加倍{{}}

代码语言:javascript
复制
script_tpl="""#!/bin/bash
#BSUB -J "renaming_{line}"
#BSUB -e /scratch/username/renaming_SNPs/renaming_{line}.err
#BSUB -o /scratch/username/renaming_SNPs/renaming_{line}.out
#BSUB -n 8
#BSUB -R "span[ptile=4]"
#BSUB -q normal
#BSUB -P DBCDOBZAK
#BSUB -W 168:00

cd /scratch/username/renaming_SNPs

awk '{{sub(/.*/,$1 "_" $3,$2)}} 1' {line}.gen > {line}.renamed.gen

"""

这是相关文档

票数 2
EN

Stack Overflow用户

发布于 2017-11-30 16:07:06

当您调用str.format时,它将尝试格式化{}中的所有内容。

所以这条线就是问题所在:

代码语言:javascript
复制
awk '{sub(/.*/,$1 "_" $3,$2)} 1' {file}.gen > {file}.renamed.gen

因为字符串格式化程序试图在格式调用中找到kwargs sub(/file,这是不存在的,因为您指定的唯一键是line=line

如果您不希望将它们考虑为格式设置,则需要转义大括号。(格式调用应该删除最后字符串中的一个对。)

代码语言:javascript
复制
awk '{{sub(/.*/,$1 "_" $3,$2)}} 1' {{file}}.gen > {{file}}.renamed.gen
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47577556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档