web-dev-qa-db-fra.com

Accéder à des données dans l'objet BLOB à partir de download_as_string in Python

J'essaie d'accéder et de modifier des données dans un fichier JSON de Newline tiré du stockage de Google Cloud dans les fonctions de Google Cloud. Les résultats apparaissent toujours comme des chiffres malgré cela qui n'étant pas les données du JSON.

Je vois que download_as_string () pour BLOB Object renvoie des octets ( https://googleaps.github.ogoogle-cloud-python/clouts/storage/google/cloud/storage/blob.html#blob.download_as_string ) Mais dans toutes les références que je vois, tout le monde est capable d'accéder à leurs données tout à fait.

Je fais cela dans des fonctions de nuage mais je pense que ma question s'appliquerait dans n'importe quel outil de GCP.

Mon exemple ci-dessous devrait simplement charger les nouvelles données JSON, l'ajoutez à une liste, sélectionnez les deux premières entrées de dictionnement, convertissez-la à Newline JSON et à la sortie en fichier JSON sur GCS. Échantillons, code et mauvais résultat énumérés ci-dessous.

Échantillon d'entrée JSON Newline

{"Website": "Google", "URL": "Google.com", "ID": 1}
{"Website": "Bing", "URL": "Bing.com", "ID": 2}
{"Website": "Yahoo", "URL": "Yahoo.com", "ID": 3}
{"Website": "Yandex", "URL": "Yandex.com", "ID": 4}

code dans la fonction de nuage

import requests
import json
import csv
from datetime import datetime, timedelta
import sys
from collections import OrderedDict
import os
import random

from google.cloud import bigquery
from google.cloud import storage

def importData(request, execution):
    # Read the data from Google Cloud Storage
    read_storage_client = storage.Client()

    # Set buckets and filenames
    bucket_name = "sample_bucket"
    filename = 'sample_json_output.json'

    # get bucket with name
    bucket = read_storage_client.get_bucket('sample_bucket')
    # get bucket data as blob
    blob = bucket.get_blob('sample_json.json')
    # download as string
    json_data = blob.download_as_string()

    # create list 
    website_list = []
    for u,y in enumerate(json_data):
        website_list.append(y)

    # select first two
    website_list = website_list[0:2]

    # Create new-line JSON
    results_ready = '\n'.join(json.dumps(item) for item in website_list)

    # Write the data to Google Cloud Storage
    write_storage_client = storage.Client()

    write_storage_client.get_bucket(bucket_name) \
        .blob(filename) \
        .upload_from_string(results_ready)

Sortie actuelle dans Sample_Json_Output.json File

123
34

Sortie attendue

{"Website": "Google", "URL": "Google.com", "ID": 1}
{"Website": "Bing", "URL": "Bing.com", "ID": 2}

Mise à jour 6/6: Si j'écris un fichier directement à partir du download_to_string blob, puis il écrit parfaitement le fichier JSON, mais je dois accéder au contenu avant.

import requests
import json
import csv
from datetime import datetime, timedelta
import sys
from collections import OrderedDict
import os
import random

from google.cloud import bigquery
from google.cloud import storage

def importData(request, execution):

    # Read the data from Google Cloud Storage
    read_storage_client = storage.Client()

    # Set buckets and filenames
    bucket_name = "sample_bucket"
    filename = 'sample_json_output.json'

    # get bucket with name
    bucket = read_storage_client.get_bucket('sample_bucket')

    # get bucket data as blob
    blob = bucket.get_blob('sample_json.json')

    # convert to string
    json_data = blob.download_as_string()


    # Write the data to Google Cloud Storage
    write_storage_client = storage.Client()

    write_storage_client.get_bucket(bucket_name) \
        .blob(filename) \
        .upload_from_string(json_data)

Mise à jour 6/6 de sortie

{"Website": "Google", "URL": "Google.com", "ID": 1}
{"Website": "Bing", "URL": "Bing.com", "ID": 2}
{"Website": "Yahoo", "URL": "Yahoo.com", "ID": 3}
{"Website": "Yandex", "URL": "Yandex.com", "ID": 4}
3
AngryWhopper

J'ai pu obtenir le résultat que vous vouliez utiliser une méthode similaire pour vous-même dans le code ci-dessous et la bibliothèque NDJSON pour la nouvelle ligne JSON.

import requests
import json
import ndjson
import csv
from datetime import datetime, timedelta
import sys
from collections import OrderedDict
import os
import random

from google.cloud import bigquery
from google.cloud import storage

def importData(request, execution):

    # Read the data from Google Cloud Storage
    read_storage_client = storage.Client()

    # Set buckets and filenames
    bucket_name = "bucket-name"
    filename = "sample_json_output.json"

    # get bucket with name
    bucket = read_storage_client.get_bucket(bucket_name)

    # get bucket data as blob
    blob = bucket.get_blob("sample_json.json")

    # convert to string
    json_data_string = blob.download_as_string()

    json_data = ndjson.loads(json_data_string)

    list = []
    for item in json_data:
        list.append(item)

    list1 = list[0:2]

    result = ""
    for item in list1:
        result = result + str(item) + "\n"


    # Write the data to Google Cloud Storage
    write_storage_client = storage.Client()

    write_storage_client.get_bucket(bucket_name) \
        .blob(filename) \
        .upload_from_string(result)
2
Corinne White

Lorsque vous lisez le blob dans JSON_DATA Vous obtenez un objet d'octets, et lorsque vous l'avez itérale, vous obtenez la représentation numérique de chaque personnage. Au-dessous d'un exemple qui crée une liste de dictes de l'objet d'octets

json_data                                                                                                                                                                                                 
b'{"Website": "Google", "URL": "Google.com", "ID": 1}\n{"Website": "Bing", "URL": "Bing.com", "ID": 2}\n{"Website": "Yahoo", "URL": "Yahoo.com", "ID": 3}\n{"Website": "Yandex", "URL": "Yandex.com", "ID": 4}\n'

type(json_data)                                                                                                                                                                                           
bytes

website_list = [json.loads(row.decode('utf-8')) for row in json_data.split(b'\n') if row]                                                                                                                 

website_list                                                                                                                                                                                              
[{'Website': 'Google', 'URL': 'Google.com', 'ID': 1},
 {'Website': 'Bing', 'URL': 'Bing.com', 'ID': 2},
 {'Website': 'Yahoo', 'URL': 'Yahoo.com', 'ID': 3},
 {'Website': 'Yandex', 'URL': 'Yandex.com', 'ID': 4}]
1
diecrf