Python 读取csv文件时出错

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

我试图编写一个脚本,其中我将文件名作为参数从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 ${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中的第一个值将是脚本的名称

两个问题

  • 您的shell脚本未正确扩展文件列表
    FILES=/home/sugoi/script/csv/*
    需要类似于:

    FILES=`ls -1 /home/sugoi/script/csv/*;`
    
  • python脚本的参数一次只能有一个文件,所以为什么要循环使用
    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/*中的文件说