我有一个名为list.txt的文件,它是一个文件名列表:
input1.txt
input2.txt
input3.txt
我想构建一个python脚本,为每个文件名创建一个文件。更确切地说,我需要它来打印一些文本,合并文件的名称并将其保存到一个唯一的.sh文件。我的脚本如下:
import os
os.chdir("/Users/user/Desktop/Folder")
with open('list2.txt','r') as f:
lines = f.read().split(' ')
for l in lines:
print "#!/bin/bash\n#BSUB -J",l+".sh","\n#BSUB -o /scratch/DBC/user/"+l+".sh.out\n#BSUB -e /scratch/DBC/user/"+l+".sh.err\n#BSUB -n 1\n#BSUB -q normal\n#BSUB -P DBCDOBZAK\n#BSUB -W 168:00\n"
print "cd /scratch/DBC/user\n"
print 'grep "input"',l+" > result."+l+".txt"
with open('script{}.sh'.format(l), 'w') as output:
output.write(l)
我有几个问题:
要清楚我的输出文件(我应该有3个)应该如下所示:
#!/bin/bash
#BSUB -J input3.sh
#BSUB -o /scratch/DBC/user/input1.sh.out
#BSUB -e /scratch/DBC/user/input3.sh.err
#BSUB -n 1
#BSUB -q normal
#BSUB -P DBCDOBZAK
#BSUB -W 168:00
cd /scratch/DBC/user
grep "input" input3 > result.input3.txt
我是Python的新手,所以我假设可以有更简单的方法来打印和插入我的文本。任何帮助将不胜感激。
更新 我现在制作了以下脚本,它几乎可以工作。
import os
os.chdir("/Users/user/Desktop/Folder")
with open('list.txt','r') as f:
lines = f.read().split('\n')
for l in lines:
header = "#!/bin/bash \n#BSUB -J %s.sh \n#BSUB -o /scratch/DBC/user/%s.sh.out \n#BSUB -e /scratch/DBC/user/%s.sh.err \n#BSUB -n 1 \n#BSUB -q normal \n#BSUB -P DBCDOBZAK \n#BSUB -W 168:00\n"%(l,l,l)
script = "cd /scratch/DBC/user\n"
script2 = 'grep "input" %s > result.%s.txt\n'%(l,l)
all= "\n".join([header,script,script2])
with open('script_{}.sh'.format(l), 'w') as output:
output.write(all)
我仍然遇到的问题是这会创建4个脚本,而不是我预期的3个脚本:script_input1.sh,script_input2.sh,script_input3.sh和script_sh。最后一个,script_sh只有印刷文本,但没有“输入”文本。我想这是因为我的list.txt文件末尾有一个“\ n”?但是,我看了,确实没有。有没有解决的办法?也许我可以使用某种长度函数?
答案 0 :(得分:1)
所以,按顺序回答:
1)你能详细说明这个问题吗?如果您的代码只生成了3个不同的脚本,那么您可以计算4个txt文件吗?
2)当然,您需要创建一个var,而不仅仅是使用print语句 3)只需更改权限
所以,总结一下,我会用这种方法:
import os
for i, file in enumerate(os.listdir("/Users/user/Desktop/Folder")):
if "input" in file:
with open(file) as f:
lines = f.readlines()
for l in lines:
data = ""
data += "#!/bin/bash\n#BSUB -J",l+".sh","\n#BSUB -o /scratch/DBC/user/"+l+".sh.out\n#BSUB -e /scratch/DBC/user/"+l+".sh.err\n#BSUB -n 1\n#BSUB -q normal\n#BSUB -P DBCDOBZAK\n#BSUB -W 168:00\n"
data += "cd /scratch/DBC/user\n"
data += 'grep "input"'+l+" > result."+l+".txt"
with open('script%s.sh'%i, 'w') as output:
output.write(data)
os.chmod("script%s.sh'%i", 700)
顺便说一句,我的代码只是一个猜测。我认为在陈述你的问题时你应该更明确。我不明白你想要达到的目标。
答案 1 :(得分:1)
另一种解决方案,而不是创建文件
script1.sh
script2.sh
script3.sh
等。将创建一个文件文件script.sh
#!/bin/bash
#BSUB -J "$1".sh
#BSUB -o /scratch/DBC/user/"$1".sh.out
#BSUB -e /scratch/DBC/user/"$1".sh.err
#BSUB -n 1
#BSUB -q normal
#BSUB -P DBCDOBZAK
#BSUB -W 168:00
cd /scratch/DBC/user
grep "input" "$1" > result."$1".txt
并使用
运行它script.sh input1
script.sh input2
script.sh input3