我有几个.json文件。我计划使用以下命令将这些文件导入MongoDB:
mongoimport -h HOSTNAME -d DATABASE -c COLLECTION -u USERNAME -p PASSWORD --file FILENAME --jsonArray
但我不想为每个文件做同样的事情。所以我写了这个Python代码。
import subprocess
import os
import glob
path = ''
for infile in glob.glob(os.path.join(path, '*.json')):
print "currently uploading: " + infile
p = subprocess.Popen('mongoimport -h HOSTNAME -d DATABASE -c COLLECTION -u USERNAME -p PASSWORD --file infile --jsonArray', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout.readlines():
print line,
retval = p.wait()
在这个程序上,infile
是一个参数,它在循环时为mongoimport
命令提供一个新的JSON文件但是我无法在循环中传递该文件名而我无法使用{{1} } print infile
命令。
有人可以让我知道我应该做什么吗?
答案 0 :(得分:1)
您通常希望将子进程的参数放在列表中,否则您的实现可能会查找名称为完整字符串(docs)的文件:
subprocess.Popen(['mongoimport', '-h', 'HOSTNAME', '-d', 'DATABASE',
'-c', 'COLLECTION', '-u', 'USERNAME', '-p', 'PASSWORD',
'--file', infile, '--jsonArray'],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
请注意infile
周围缺少引号来传递参数。
或者,您可以直接在bash中执行此操作。
for input in *.json
do
echo "Currently uploading: $input"
mongoimport -h HOSTNAME -d DATABASE -c COLLECTION \
-u USERNAME -p PASSWORD --file "$input" --jsonArray
done