我正在编写一个python脚本,它接受两个参数,允许我将文件夹的内容输出到文本文件,供我用于另一个进程。我的片段如下:
#!/usr/bin/python
import cv2
import numpy as np
import random
import sys
import os
import fileinput
#Variables:
img_path= str(sys.argv[1])
file_path = str(sys.argv[2])
print img_path
print file_path
cmd = 'find ' + img_path + '/*.png | sed -e "s/^/\"/g;s/$/\"/g" >' + file_path + '/desc.txt'
print "command: ", cmd
#Generate desc.txt file:
os.system(cmd)

当我尝试从命令行运行时,我得到以下输出,我不知道如何解决它。
sh: 1: s/$//g: not found

我通过在一个新的终端实例中运行以下命令测试了我正在使用的命令,它运行良好:
images/*.png | sed -e "s/^/\"/g;s/$/\"/g" > desc.txt

任何人都可以看到为什么我的代码片段不起作用?当我运行它时,我得到一个空文件......
提前致谢!
答案 0 :(得分:0)
它没有将正则表达式的全文发送到bash,因为python如何处理和转义字符串内容,所以最好的最快解决方案就是手动转义字符串中的反斜杠,因为python认为它们目前是逃脱码。所以改变这一行:
cmd = 'find ' + img_path + '/*.png | sed -e "s/^/\"/g;s/$/\"/g" >' + file_path + '/desc.txt'
到此:
cmd = 'find ' + img_path + '/*.png | sed -e "s/^/\\"/g;s/$/\\"/g" >' + file_path + '/desc.txt'
这应该适合你。
虽然,对你的问题的评论有一个很好的观点,你可以完全从python中做到这一点,例如:
import os
import sys
def main():
# variables
img_path= str(sys.argv[1])
file_path = str(sys.argv[2])
with open(file_path,'w') as f:
f.writelines(['{}\n'.format(line) for line in os.listdir(img_path) if line.endswith('*.png')])
if __name__ == "__main__":
main()
答案 1 :(得分:0)
我完全赞同凯尔。我的建议是只使用python代码比调用代码中的bash命令更好。这是我推荐的代码,它比上面提到的更长,并不是最优的,但恕我直言,这是一个更容易理解的解决方案。
#!/usr/bin/python
import glob
import sys
import os
# Taking arguments
img_path = str(sys.argv[1])
file_path = str(sys.argv[2])
# lets put the target filename in a variable (it is better than hardcoding it)
file_name = 'desc.txt'
# folder_separator is used to define how your operating system separates folders (unix / and windows \)
folder_separator = '\\' # Windows folders
# folder_separator = '/' # Unix folders
# better if you make sure that the target folder exists
if not os.path.exists(file_path):
# if it does not exist, you create it
os.makedirs(file_path)
# Create the target file (write mode).
outfile = open(file_path + '/' + file_name, 'w')
# loop over folder contents
for fname in glob.iglob("%s/*" % img_path):
# for every file found you take only the name (assuming that structure is folder/file.ext)
file_name_in_imgPath = fname.split('\\')[1]
# we want to avoid to write 'folders' in the target file
if os.path.isfile(file_name_in_imgPath):
# write filename in the target file
outfile.write(str(file_name_in_imgPath) + '\n')
outfile.close()