Keyerror在阅读csv文件时

时间:2016-01-07 19:32:13

标签: python shell

我正在尝试编写一个脚本,我将文件名作为参数从shell脚本传递给python脚本和python脚本进程脚本。
它给了我keyerror但是如果我运行相同的脚本硬编码文件名它工作正常。

#!/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)

我做错了什么?

2 个答案:

答案 0 :(得分:1)

两个问题。

  1. 您的shell脚本未正确扩展文件列表。
  2. FILES=/home/sugoi/script/csv/*需要像:

    FILES=`ls -1 /home/sugoi/script/csv/*;`
    
    1. 您对python脚本的参数一次只能是一个文件,那么为什么要遍历sys.argv
    2. 只需使用参数本身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和调用脚本之间进行操作。

答案 1 :(得分:0)

sys.argv中的第一个值将是脚本的名称。 reference