Python Ошибка атрибута BigQuery: у объекта 'Row' нет атрибута - PullRequest
0 голосов
/ 24 марта 2020

У меня есть объект строки row.total_bytes_processed, строки которого возвращают None. Если он возвращает None, у меня есть logi c для значения по умолчанию 0

for row in rows:
        if row.total_bytes_processed is  not None:
            cost_dollars = (row.total_bytes_processed/1024 **4) *5
            print( f"JOB_ID : {row.job_id} | Creation_Time : {row.creation_time} |  Query: {row.query} | Total_Bytes_processed : {row.total_bytes_processed} | Estimated_Cost : ${cost_dollars}".format(
            row.job_id, row.creation_time, row.query, row.total_bytes_processed,cost_dollars))
        else:
            row.total_bytes_processed = 0 # <- Error occurs here
            cost_dollars = (int(row.total_bytes_processed) / 1024 ** 4) * 5
            print(f"JOB_ID : {row.job_id} | Creation_Time : {row.creation_time} |  Query: {row.query} | Total_Bytes_processed : {row.total_bytes_processed} | Estimated_Cost : ${cost_dollars}".format(row.job_id, row.creation_time, row.query, row.total_bytes_processed, cost_dollars))

Тем не менее, когда я получаю эту ошибку:

row.total_bytes_processed = 0
AttributeError: 'Row' object has no attribute 'total_bytes_processed'

Как это исправить ошибка? Могу ли я не использовать по умолчанию None (Nonetype) в 0?

Я проверил, что во всех строках есть total_bytes_processed.

вот мой исходный код:

from google.cloud import bigquery
from google.oauth2 import service_account



sql = """
SELECT
job_id,
creation_time,
user_email,
query,
total_bytes_processed
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE project_id ='nj-dev-blah'
AND creation_time BETWEEN TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 183 DAY)
AND CURRENT_TIMESTAMP()
ORDER BY creation_time DESC
LIMIT 100
"""


query_job = client.query(sql)# Make an API request.
results = query_job.result()
rows = list(results)
print("The query data:")
# print(rows)
for row in rows:
    if row.total_bytes_processed is  not None:
        cost_dollars = (row.total_bytes_processed/1024 **4) *5
        print( f"JOB_ID : {row.job_id} | Creation_Time : {row.creation_time} |  Query: {row.query} | Total_Bytes_processed : {row.total_bytes_processed} | Estimated_Cost : ${cost_dollars}".format(
        row.job_id, row.creation_time, row.query, row.total_bytes_processed,cost_dollars))
    else:
        row.total_bytes_processed = 0
        cost_dollars = (int(row.total_bytes_processed) / 1024 ** 4) * 5
        print(f"JOB_ID : {row.job_id} | Creation_Time : {row.creation_time} |  Query: {row.query} | Total_Bytes_processed : {row.total_bytes_processed} | Estimated_Cost : ${cost_dollars}".format(row.job_id, row.creation_time, row.query, row.total_bytes_processed, cost_dollars))

1 Ответ

1 голос
/ 24 марта 2020

Наличие атрибута, равного «Нет», отличается от отсутствия такого атрибута вообще, если вы используете:

if row.total_bytes_processed is not None:

Python попытается получить доступ к атрибуту этого объекта, называемому «total_bytes_processed» и затем сравнивая его с None. Вы получаете эту ошибку, потому что в этом случае атрибут "total_bytes_processed" не существует для этого объекта.

Вы можете использовать метод "hasattr", указать объект и имя атрибута, который вы используете. ищите, как параметры, и метод вернет True, если параметр существует, и False в противном случае:

if hasattr(row, "total_bytes_processed"):

Имейте в виду, что hasattr все равно вернет True, даже если атрибут существует и равен «Нет». ", чтобы вы могли поставить его как и внешнюю проверку, а затем, после того как вы знаете, что атрибут существует, проверить, равен ли он" Нет ", и действовать соответственно. Это было бы что-то вроде:

for row in rows:
  if hasattr(row, "total_bytes_processed"):
    if row.total_bytes_processed is not None:
        cost_dollars = (row.total_bytes_processed/1024 **4) *5
        print( f"JOB_ID : {row.job_id} | Creation_Time : {row.creation_time} |  Query: {row.query} | Total_Bytes_processed : {row.total_bytes_processed} | Estimated_Cost : ${cost_dollars}".format(
        row.job_id, row.creation_time, row.query, row.total_bytes_processed,cost_dollars))
    else:
        row.total_bytes_processed = 0
        cost_dollars = (int(row.total_bytes_processed) / 1024 ** 4) * 5
        print(f"JOB_ID : {row.job_id} | Creation_Time : {row.creation_time} |  Query: {row.query} | Total_Bytes_processed : {row.total_bytes_processed} | Estimated_Cost : ${cost_dollars}".format(row.job_id, row.creation_time, row.query, row.total_bytes_processed, cost_dollars))
  else:
    #code for when total_bytes_processed does not exists
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...