从AWS S3存储桶读取txt文件仅返回最后30行如何获取全部内容
问题排查与解决方法
首先确认代码实际是否真的只拉取到了30行数据,绝大多数该类问题都是运行环境的显示限制导致的错觉,而非代码逻辑问题。
第一步:验证实际读取到的行数
在你的data = res.get()['Body'].read().decode('utf-8').splitlines()行后添加一行代码,打印获取到的总长度:
print(f"实际读取到的文件行数:{len(data)}")
如果输出的行数和你S3上存储的txt文件实际行数一致,说明数据已经被完整拉取,可根据运行环境调整设置:
- 本地终端运行:调整终端的滚动缓冲区设置,即可查看历史输出的全部内容
- Jupyter/Colab等Notebook环境运行:环境默认限制了单单元格的最大输出行数,可改用一次性输出全部内容的写法:
或者直接把内容写入本地文件验证完整性:print('\n'.join(data))with open('s3_file_content.txt', 'w', encoding='utf-8') as f: f.write('\n'.join(data))
第二步:如果确认实际读取行数确实不足
如果len(data)的数值明显小于文件实际行数,可以尝试以下优化方案:
- 修正代码中可能存在的变量名笔误:你当前贴出的代码初始化的资源实例变量是
s3,但调用Object方法时用的是s3_client,如果实际运行代码存在该问题会触发报错,需保持变量名统一。 - 避免大文件读取时出现的截断问题,改用流式逐行读取的写法,同时兼容编码异常处理:
import boto3 import codecs s3 = boto3.resource('s3') res = s3.Object(bucket_name, key_name) data = [] # 流式逐行读取,降低大文件内存占用同时防止内容截断 with codecs.getreader('utf-8')(res.get()['Body']) as reader: for line in reader: cleaned_line = line.strip() data.append(cleaned_line) print(cleaned_line) print(f"总读取行数:{len(data)}") - 确认你的txt文件编码确实为UTF-8,如果是GBK、Latin-1等其他编码,把代码中的
utf-8替换为对应编码即可,避免解码异常导致内容提前截断。
内容的提问来源于stack exchange,提问作者user12532474
相关产品推荐
相关产品推荐

