Как читать csv файл с использованием pandas и облачных функций в GCP? - PullRequest
1 голос
/ 06 августа 2020

Я просто пытаюсь прочитать файл csv, который был загружен в GCS.

Я хочу прочитать файл csv, который загружается в GCS с помощью облачных функций в GCP. И я хочу обрабатывать данные csv как «DataFrame».

Но я не могу прочитать файл csv, используя pandas.

Это код для чтения файла csv на GCS с использованием облачных функций.

def read_csvfile(data, context):
     try:
          bucket_name = "my_bucket_name"
          file_name = "my_csvfile_name.csv"
          project_name = "my_project_name"

          # create gcs client
          client = gcs.Client(project_name)
          bucket = client.get_bucket(bucket_name)
          # create blob
          blob = gcs.Blob(file_name, bucket)
          content = blob.download_as_string()
          train = pd.read_csv(BytesIO(content))
          print(train.head())
     
     except Exception as e:
          print("error:{}".format(e))

Когда я запустил свой код Python, я получил следующую ошибку.

No columns to parse from file

Некоторые веб-сайты говорят, что ошибка означает, что я прочитал пустой файл CSV. Но на самом деле я загружаю непустой csv файл. Итак, как я могу решить эту проблему?

пожалуйста, помогите мне. Спасибо.

---- добавить в 2020/08/08 -------

Спасибо за вашу помощь! Но, наконец, я не могу читать csv-файл с помощью вашего кода ... У меня все еще есть ошибка: No columns to parse from file.

Итак, я попробовал новый способ чтения csv-файла как байтового типа. Ниже приведен новый код Python для чтения файла csv.

MAIN.PY

from google.cloud import storage
import pandas as pd
import io
import csv
from io import BytesIO 

def check_columns(data, context):
    try:
        object_name = data['name']
        bucket_name = data['bucket']

        storage_client = storage.Client()
        bucket = storage_client.bucket(bucket_name)
        blob = bucket.blob(object_name)
        data = blob.download_as_string()
        
        #read the upload csv file as Byte type.
        f = io.StringIO(str(data))
        df = pd.read_csv(f, encoding = "shift-jis")

        print("df:{}".format(df))     
        print("df.columns:{}".format(df.columns)) 
        print("The number of columns:{}".format(len(df.columns)))

REQUIREMENTS.TXT

Click==7.0
Flask==1.0.2
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
Pillow==5.4.1
qrcode==6.1
six==1.12.0
Werkzeug==0.14.1
google-cloud-storage==1.30.0
gcsfs==0.6.2
pandas==1.1.0

Результат, который я получил, приведен ниже.

df:Empty DataFrame
Columns: [b'Apple, Lemon, Orange, Grape]
Index: []
df.columns:Index(['b'Apple', 'Lemon', 'Orange', 'Grape'])
The number of columns:4

Итак, я мог прочитать только первую запись в файле csv как df.column !? Но я не смог получить другие записи в файле csv ... И первый столбец - это не столбец, а обычная запись.

Итак, как я могу получить некоторые записи в файле csv как DataFrame с использованием pandas?

Не могли бы вы мне еще раз помочь? Спасибо.

1 Ответ

1 голос
/ 06 августа 2020

Pandas, начиная с версии 0.24.1, может напрямую читать URI Google Cloud Storage.

Например:

gs://awesomefakebucket/my.csv

Ваш сервисный аккаунт прикреплен к вашей функции должен быть доступ для чтения файла CSV.

Пожалуйста, не стесняйтесь тестировать и изменять этот код.

Я использовал Python 3,7

function.py

from google.cloud import storage
import pandas as pd

def hello_world(request):
    # it is mandatory initialize the storage client
    client = storage.Client()
    #please change the file's URI
    temp = pd.read_csv('gs://awesomefakebucket/my.csv', encoding='utf-8')
    print (temp.head())
    return f'check the results in the logs'

requirements.txt

google-cloud-storage==1.30.0
gcsfs==0.6.2
pandas==1.1.0

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