#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 .