Как создать график с помощью nx.read_edgelist, если мой csv-файл присутствует в S3?

#python #amazon-web-services #csv #amazon-s3 #networkx

#python #amazon-веб-сервисы #csv #amazon-s3 #networkx

Вопрос:

У меня есть csv-файл, расположенный в одном из моих сегментов S3 (s3://abc/FB/train_woheader.csv). Когда я пишу..

 g=nx.read_edgelist('s3://abc/FB/train_woheader.csv',delimiter=',',create_using=nx.DiGraph(),nodetype=int, encoding='utf-8')
print(nx.info(g))
  

в нем говорится

 FileNotFoundError: [Errno 2] No such file or directory: 's3://abc/FB/train_woheader.csv'
  

Однако, если я сохраню csv в экземпляре Jupyter, я смогу создать график, используя строку

 g=nx.read_edgelist('train_woheader.csv',delimiter=',',create_using=nx.DiGraph(),nodetype=int, encoding='utf-8')
  

CSV — это тяжелый файл и, следовательно, его нужно сохранять только в S3. Его нельзя сохранить в экземпляре Jupyter, поскольку он занимает много места.

Любая помощь по этому поводу?

Ответ №1:

read_edgelist ожидает получить файл или имя файла в качестве аргумента.
Что вы можете сделать, это прочитать файл из s3 (используя boto3), использовать StringIO и передать заполненный файл в read_edgelis:

 import io.StringIO()
with io.StringIO() as f
    f.write('data_coming_from_s3_using_boto3')
    f.seek(0)
    g=nx.read_edgelist(f,delimiter=',',create_using=nx.DiGraph(),nodetype=int, encoding='utf-8')
  

Комментарии:

1. Спасибо, но можете ли вы объяснить, каким должен быть ‘data_coming_from_s3_using_boto3’? Это что-то вроде этого import boto3 bucketname = '<bucket-name>' itemname = '<file-name>' s3 = boto3.resource('s3') obj = s3.Object(bucketname, itemname) data_coming_from_s3_using_boto3 = obj.get()['Body'].read()

2. ДА. Это направление!

3. Огромное спасибо! Этот подход сработал. Мои данные были в байтах и, следовательно, вместо StringIO работал BytesIO .