Python 读取csv文件时出错
我试图编写一个脚本,其中我将文件名作为参数从shell脚本传递到python脚本,python脚本处理该脚本。Python 读取csv文件时出错,python,shell,Python,Shell,我试图编写一个脚本,其中我将文件名作为参数从shell脚本传递到python脚本,python脚本处理该脚本。这给了我keyrerror,但如果我运行相同的脚本,对文件名进行硬编码,它就可以正常工作 #!/bin/sh LOCKFILE=./test.txt if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then echo "already running" exit fi trap "rm -f ${LOCKF
这给了我keyrerror,但如果我运行相同的脚本,对文件名进行硬编码,它就可以正常工作
#!/bin/sh
LOCKFILE=./test.txt
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
echo "already running"
exit
fi
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}
# do stuff
FILES=/home/sugoi/script/csv/*
for file in $FILES
do
python ./csvTest.py $file
#mv $file ./archive
done
rm -f ${LOCKFILE}
exit
Python:from pymongo import MongoClient
import csv
import json
import sys
client = MongoClient()
db = client.test
for arg in sys.argv:
try:
csvfile = open(arg, 'r')#if i hardcode file name here it works fine
except IOError as e:
#write to error log
sys.exit(100)
reader = csv.DictReader(csvfile)
header=reader.next()
for each in reader:
row={}
for field in header:
row[field]=each[field]
db.test.update({"_id": row["CustomerId"]}, {"$push": {"activities":{"action": row["Action"],"date" :row["Timestamp"],"productId":row["productId"]}}},True)
我做错了什么?sys.argv中的第一个值将是脚本的名称 两个问题
FILES=/home/sugoi/script/csv/*
需要类似于:
FILES=`ls -1 /home/sugoi/script/csv/*;`
sys.argv
李>
只需使用参数本身,sys.argv[1]
。正如@Brian Besmanoff所指出的,这需要索引1
,因为脚本名称本身存储在sys.argv[0]
中
try:
csvfile = open(sys.argv[1], 'r')
except IOError as e:
(...)
最后:您可以使用Python解析目录,而不是在shell脚本中循环。查看
os
模块,尤其是os.listdir()
。再多做一点工作,您就可以在一个Python脚本中运行整个程序,而不是在shell和调用脚本之间来回切换。检查shell脚本中文件=/home/sugoi/script/csv/*
的输出,我认为这与您认为的不一样。为什么不打印(arg)以查看arg变量设置为什么?这是基本的“调试”。您可以对/home/sugoi/script/csv/*中的文件说。