Почему мои выходные данные только одна строка, когда я пытаюсь вывести мой dataframe в CSV-файл? Python3 / boto3 - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь записать значение моего bucket.name и obj.key в файл csv с соответствующим значением в соответствующем столбце.

Когда я запускаю приведенный ниже код, он выводит только одну строку в мой CSV-файл:

bucket_name | key_s3_path

value        , value

Однако вывод моей переменной ff:

{'bucket_name': ["'mybucket', "], 'key_s3_path'["'my/file/path/80ece.txt', "]}
{'bucket_name': ["'mybucket', "], 'key_s3_path': ["'my/file/path/80ece.txt', "]}
{'bucket_name': ["'mybucket', "], 'key_s3_path': ["'my/file/path/80ece.txt', "]}

Как видите, существует три значения, но оно записывает только одно из трех значений в файл CSV.

Вот мой код:

def load_into_csv(years):
    for year in years:
        for buckett in s3.buckets.all():
            for aobj in buckett.objects.filter(Bucket=bucket,Prefix=PREFIX):
                if year in aobj.key:
                   f= "'{}', ".format(buckett.name)
                   ff= "'{}', ".format(aobj.key)
                   #print(f)
                   dd = {'bucket_name':[f], 'key_s3_path':[ff]}
                    #print(dd)
                   df = pd.DataFrame(data=dd)
                    #print(df)
                   export_csv = df.to_csv (r'my/path/0177_s3_files_v2.csv', index = None, header=True)

years=['2017']
load_into_csv(years)

ЛЮБЫЕ ИДЕИ, почему это происходит?

1 Ответ

3 голосов
/ 16 января 2020

Вы пишете свой export_csv() внутри л oop. Таким образом, на каждой итерации вы перезаписываете старый df, а также перезаписываете свой 0177_s3_files_v2.csv.

. Вместо перезаписи df вы должны попытаться добавить значения в df, а затем, когда завершится ваш для l oop напишите csv.

Попробуйте что-то вроде этого:

def load_into_csv(years):
    df = pd.DataFrame()
    for year in years:
        for buckett in s3.buckets.all():
            for aobj in buckett.objects.filter(Bucket=bucket,Prefix=PREFIX):
                if year in aobj.key:
                   f= "'{}', ".format(buckett.name)
                   ff= "'{}', ".format(aobj.key)
                   #print(f)
                   dd = {'bucket_name':[f], 'key_s3_path':[ff]}
                    #print(dd)
                   df_2 = pd.DataFrame(data=dd)
                   df = df.append(df_2, ignore_index=True)
    export_csv = df.to_csv (r'my/path/0177_s3_files_v2.csv', index = None, header=True)

Редактировать: Более эффективное решение.

 def load_into_csv(years):
    list_dd = []
    for year in years:
        for buckett in s3.buckets.all():
            for aobj in buckett.objects.filter(Bucket=bucket,Prefix=PREFIX):
                if year in aobj.key:
                    f= "'{}', ".format(buckett.name)
                    ff= "'{}', ".format(aobj.key)
                    # Store into a list the bucket_name and the path.
                    list_dd.append( [f, ff] )

    # Create the dataframe with the list previusly generated.
    df = pd.DataFrame(list_dd, columns = ['bucket_name', 'key_s3_path'])
    export_csv = df.to_csv (r'my/path/0177_s3_files_v2.csv', index = None, header=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...