2013-07-12 24 views
0

我目前正在做我的第一個python工作,修改了一些朋友編寫的代碼。我正在使用python 2.6.6。最初的一段代碼可以從信用卡捐贈數據的日誌文件中提取信息給我的公益組織。我的新版本,如果它有一天工作,將執行相同的任務,由貝寶做的捐贈。日誌文件相似,但具有不同的字段名稱和其他差異。神祕的''str'對象不可調用「python error


我收到錯誤消息是:

回溯(最近通話最後一個): 文件 「../logparse-paypal-1.py」,線路196,在 convert_log( sys.argv [1],sys.argv [2],access_ids) 文件「../logparse-paypal-1.py」,第170行,在convert_log中 output = [f(record,access_ids)for f in output_fns ] TypeError:'str'對象不可調用

我讀過一些與此錯誤相關的論壇上的帖子消息,但到目前爲止,我還在海上。我無法找到與可能問題對象(access_ids)相關的代碼部分與我開始使用的代碼之間的任何結果性差異。我所做的與access_ids表相關的部分是刪除一些行,這些行會打印腳本發現的問題,並導致表忽略某些數據。也許我在做這件事的時候改了一個角色或者其他的東西,但是我看了看,到目前爲止找不到任何東西。

正在生產這些錯誤消息的代碼的部分是以下各項:

  # Use the output functions configured above to convert the 
      # transaction record into a list of outputs to be emitted to 
      # the CSV output file. 
      print "Converting %s at %s to CSV" % (record["type"], record["time"]) 
      output = [f(record, access_ids) for f in output_fns] 
      j = 0 
      while j < len(output): 
        os.write(csv_fd, output[j]) 
        if j < len(output) - 1: 
          os.write(csv_fd, ",") 
        else: 
          os.write(csv_fd, "\n") 
        j += 1 
      convert_count += 1 

    print "Converted %d approved transactions to CSV format, skipped %d non-approved transactions" % (convert_count, skip_count) 

if __name__ == '__main__': 
    if len(sys.argv) < 3: 
      print "Usage: logparse.py INPUT_FILE OUTPUT_FILE [ACCESS_IDS_FILE]" 
      print 
      print " INPUT_FILE  Silent post log containing transaction records (must exist)" 
      print " OUTPUT_FILE  Filename for the CSV file to be created (must not exist, will be created)" 
      print " ACCESS_IDS_FILE List of Access IDs and email addresses (optional, must exist if specified)" 
      sys.exit(-1) 

    access_ids = {} 
    if len(sys.argv) > 3: 
      access_ids = load_access_ids(sys.argv[3]) 

    convert_log(sys.argv[1], sys.argv[2], access_ids) 

170行是這一個: 輸出=

[用於output_fns F F(記錄,access_ids)]

和線196是這樣的一種: convert_log(sys.argv中[1],sys.argv中[2],access_ids)


的access_ids定義,possib LY相關的問題,是這樣的:

def access_id_fn(record, access_ids): 
     if "payer_email" in record and len(record["payer_email"]) > 0: 
       if record["payer_email"] in access_ids: 
         return '"' + access_ids[record["payer_email"]] + '"' 
       else: 
         return "" 
     else: 
       return "" 

def load_access_ids(filename): 
     print "Loading Access IDs from %s..." % filename 
     access_ids = {} 
     for line in open(filename, "r"): 
       line = line.rstrip() 
       access_id, email = [s.strip() for s in line.split(None, 1)] 
       if not email_address.match(email): 
         continue 
       if email in access_ids: 
         access_ids[string.strip(email)] = string.strip(access_id) 
     return access_ids 

預先感謝任何與此建議。

  • 戴夫
+0

您可以發佈一個顯示問題的[* complete *](http://sscce.org/#selfcon)測試程序嗎?很可能,'output_fn'的值是問題。 – phihag

+1

我認爲你的問題是output_fns是一個字符串列表。因此,在列表理解語句的上下文中,f()不是一個函數,而是一個字符串。嘗試在行170「print'%s'%output_fns」 – user590028

+0

@ user590028之前添加以下打印語句,我添加了該行。這是我現在得到的消息: 文件「../logparse-paypal-1.py」,線170,在convert_log 打印‘%s’的%output_fns 類型錯誤:不串轉換過程中的所有參數格式 –

回答

0

,我沒有看到任何東西馬上手,但你沒有提到的日誌文件是相似的,我認爲這意味着有兩個之間的差異。

你可以發佈每一行嗎?

我會仔細檢查日誌文件中的數據,並確保您認爲正在讀取的內容是正確的。這在我看來似乎正在讀入一段數據,但在某處破壞了代碼的期望。

+0

感謝您的幫助。其中一個正在讀入的文件對於兩個文件都是相同的,即讀入access_ids數組的文件。下面是一個示例行: 59337 [email protected] 下面是從日誌文件中的一些行,這是獲得這個腳本的第一個版本正確讀取: 網絡捐贈 2013-07-01T04:03: 15-05:00 x_response_code:3 x_response_reason_code:8 x_response_reason_text:信用卡已過期。 x_avs_code:P x_auth_code: ,這裏是從較新的日誌文件中的一些行: 網絡捐贈 2013-07-10T18:16:16-05:00 mc_gross:1.00 protection_eligibility:符合資格 –