【问题标题】:Why is my output only one row when i try outputting my dataframe to a csv file?Python3/boto3当我尝试将数据帧输出到 csv 文件时,为什么我的输出只有一行?Python3/boto3
【发布时间】:2020-05-03 15:25:19
【问题描述】:

我正在尝试将我的 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)

关于为什么会发生这种情况的任何想法?

【问题讨论】:

    标签: python-3.x pandas numpy csv boto3


    【解决方案1】:

    您在 foo 循环中写入您的 export_csv()。因此,在每次迭代中,您都会覆盖旧的 df 并覆盖您的 0177_s3_files_v2.csv。

    您应该尝试而不是覆盖 df,而是将值附加到 df,然后在您的 for 循环结束时写入 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)
    

    【讨论】:

    • 谢谢!你应该得到奖励
    • 谢谢!!帮助总是很高兴^^
    • 这确实有效,但速度很慢。你知道提高速度的方法吗?也许是作家?
    • 这确实有效,但速度很慢。你知道提高速度的方法吗?也许是作家?
    • 是的append不是一个非常有效的方法。您可以使用列表来存储您的 dd 变量,并在循环结束时创建最终数据帧。查看我的编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多