AttributeError: у объекта 'unicode' нет атрибута 'get' - PullRequest
0 голосов
/ 15 января 2020

У меня проблема с созданием файла CSV из моей базы данных. Ниже приведен мой код.

import pymysql  
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import csv
from datetime import datetime
import time
import json
# open connection to the database  
conn = pymysql.connect(host='your host',  
                       port=3306,  
                       user='user_name',  
                       passwd='',  
                       db='ai_demo',  
                       charset='utf8')  
cur = conn.cursor()  

sql = "SELECT order_data FROM `transactions`" 
cur.execute(sql) 
rows = cur.fetchall()
data = {}
dadaArray=[]
for row in rows:
    #print(row)
    for i in row:
         s=json.loads(i)
    for item in s:
        date_str = item.get('date')
        date_object = datetime.strptime(date_str, '%Y-%m-%d')
        #print(date_object)
        time_str = item.get('time')
        time_object = datetime.strptime(time_str, '%H:%M:%S').time()
        print(time_object)
        date_time_object = datetime.combine(date_object,time_object)
        #print(date_time_object)
        subscription_price = item.get('totalOrderSubscriptionPrice')
        data['timestamp'] =date_time_object.strftime('%Y-%m-%d %H:%M:%S')
        data['price'] = json.loads(subscription_price)
        #print(data)
        dadaArray.append(data)


#with open("out.csv", "w", newline='') as csv_file:  # Python 3 version    
with open("out.csv", "wb") as csv_file:              # Python 2 version
    csv_writer = csv.writer(csv_file)
    csv_writer.writerow([data for data in dadaArray]) # write headers
    csv_writer.writerows(cur)
# close connection to the database  
cur.close()  
conn.close()

Проблема в том, что я получаю некоторые значения правильно, но через некоторое время он начинает выдавать ошибку "AttributeError: у объекта 'Unicode' нет атрибута 'get'"

Вот полная консоль моего шпиона :

runfile('/Users/mss/.spyder/temp.py', wdir='/Users/mss/.spyder')
06:29:58
06:30:05
06:30:11
06:30:23
06:36:48
06:38:57
06:46:41
07:15:32
07:51:57
07:52:02
07:51:57
07:52:02
08:52:40
08:52:50
08:52:55
08:52:40
08:52:50
08:52:55
08:52:40
08:52:50
08:52:55
Traceback (most recent call last):

  File "<ipython-input-3-b3aa9a745687>", line 1, in <module>
    runfile('/Users/mss/.spyder/temp.py', wdir='/Users/mss/.spyder')

  File "/Users/mss/opt/anaconda2/lib/python2.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 827, in runfile
    execfile(filename, namespace)

  File "/Users/mss/opt/anaconda2/lib/python2.7/site-packages/spyder_kernels/customize/spydercustomize.py", line 102, in execfile
    builtins.execfile(filename, *where)

  File "/Users/mss/.spyder/temp.py", line 28, in <module>
    date_str = item.get('date')

AttributeError: 'unicode' object has no attribute 'get'

Я не уверен, почему он останавливается между тем, как он первоначально предоставлял мне даты, но после некоторого зацикливания он останавливается и начинает говорить, что «объект Unicode» не имеет атрибута «get». Но, как вы можете видеть, он напечатал несколько дат до отображения этой ошибки.

Это то, что мой item выглядит так (для элемента в s:):

{u'delivered': u'yes', u'versionCode': u'2.2', u'date': u'2019-09-08', u'containerGiven': u'0', u'items': [{u'unit_name': u'ML', u'pricr_per_package': 19, u'name': u'NANDINI TONED', u'containerGiven': u'0', u'sub_id': 299, u'quantity_child': 1, u'containerCollect': u'0', u'modify_data': 0, u'pro_price': 0, u'child_package_qty': 500, u'type': u'subscription', u'id': 578, u'quantity': 1}], u'totalOrderSubscriptionPrice': u'19.0', u'userId': u'989', u'containerCollect': u'0', u'time': u'06:29:58', u'custom_ids': u'[]', u'schdule_id': 54, u'subscription_ids': u'[299]'}

Я могу выглядеть глупо. Но дело в том, что я очень новичок в Python. Пожалуйста, дайте мне знать причину, по которой это происходит. Любая помощь будет принята с благодарностью !!!!

1 Ответ

0 голосов
/ 16 января 2020

Итак, есть две проблемы, которые я вижу в коде, первая проблема:

for i in row:
    s=json.loads(i)

Если row имеет длину n элементов, то вы, по сути, отбрасываете все значения, которые не являются последний пункт, n. Причина этого в том, что ваш следующий for -l oop имеет отступ на том же уровне, что и этот l oop.

Вторая проблема:

for item in s:
    date_str = item.get('date')

Поскольку мы знаем s - это блоб JSON (по сути, словарь), мы не можем перебирать его так же, как список, так как мы просто перебираем ключи в словаре. Похоже, вы хотите, чтобы ваш код выглядел следующим образом:

for i in row:
    s = json.loads(i)
    date_str = s.get('date')
    date_object = datetime.strptime(date_str, '%Y-%m-%d')
    #print(date_object)
    time_str = s.get('time')
    ...

Здесь вам нужен только один код для -l oop, основываясь на данных, которые вы показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...