2013-07-12 4 views
0

В настоящее время я делаю свое первое усилие python, модификацию некоторого кода, написанного другом. Я использую python 2.6.6. Исходный фрагмент кода, который работает, извлекает информацию из файла журнала данных из пожертвований, сделанных с помощью кредитной карты, моей некоммерческой организации. Моя новая версия, если она будет работать в один прекрасный день, выполнит ту же задачу для пожертвований, которые были сделаны paypal. Файлы журнала похожи, но имеют разные имена полей и другие отличия.mysterious "'str' объект не вызываем" ошибка python


Сообщения об ошибках я получаю это:

Traceback (самый последний вызов последнего): Файл "../logparse-paypal-1.py", строка 196, в convert_log (sys.argv [1], sys.argv [2], access_ids) Файл «../logparse-paypal-1.py», строка 170, в convert_log output = [f (запись, access_ids) для f в output_fns ] ТипError: объект '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 это: выход = [F (запись, access_ids) для F в output_fns]

и линия 196 это одно: convert_log (sys.argv [1], sys.argv [2], access_ids)


определение access_ids, поз Сибли связана с проблемой, заключается в следующем:

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 

Заранее спасибо за любые советы с этим.

  • Dave
+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 TypeError: не все аргументы преобразуются во строки форматирования –

ответ

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: Приемлемые –