如何通过CloudFormation和Cloud9定期将Dataframe转为无分隔符TXT上传至S3?
解决方案
要生成无分隔符的整行文本并上传到S3,可以通过先将DataFrame每行的所有列拼接成单个字符串,再将这些字符串按行写入文本文件的方式实现,替代原to_excel的逻辑。以下是修改后的完整代码:
import awswrangler as wr import boto3 import os import pandas as pd import logging logger = logging.getLogger(__name__) def add_partition_cols_to_path(today_date, path): # 替换文件后缀为.txt path += 'year='+today_date.strftime('%Y')+'/month='+today_date.strftime('%m')+'/day='+today_date.strftime('%d')+'/ITGFSCEP'+ today_date.strftime('%Y') + today_date.strftime('%m') + today_date.strftime('%d') + '.txt' return path def write_file(df, path): try: if df.empty: raise TypeError("Empty Dataframe") logger.info('Writing files in: %s', path) # 1. 预处理列格式(按需添加:比如数值补零、日期格式化) # 示例:若某数值列需要固定6位,补前导零:df['num_col'] = df['num_col'].astype(str).str.zfill(6) # 处理空值:df = df.fillna('') # 2. 将每行所有列转为字符串后拼接成无分隔符的整行内容 txt_lines = df.astype(str).agg(''.join, axis=1) # 3. 将所有行拼接为带换行符的完整文本 txt_content = '\n'.join(txt_lines) # 4. 使用awswrangler上传到S3,和原to_excel用法保持一致 wr.s3.to_text(txt_content, path) except Exception as e: logger.error("Error writing files: %s", e) raise e
关键注意点
- 列格式预处理:如果DataFrame包含数值、日期等非字符串类型列,必须先将其格式化为符合要求的字符串(比如数值补前导零、日期转指定格式),否则拼接后会出现不符合预期的内容。
- 空值处理:若存在缺失值,建议提前用
df.fillna('')将空值替换为空字符串,避免拼接后出现NaN等无效字符。 - 备选上传方式:如果不想用
wr.s3.to_text,也可以直接用boto3客户端上传:s3_client = boto3.client('s3') bucket_name, s3_key = wr.s3.parse_path(path) s3_client.put_object(Bucket=bucket_name, Key=s3_key, Body=txt_content.encode('utf-8'))
内容的提问来源于stack exchange,提问作者fervifervi
相关产品推荐
相关产品推荐

