Python读取AWS S3中列数据末尾含反斜杠的CSV文件时的解析问题
Python读取AWS S3中列数据末尾含反斜杠的CSV文件时的解析问题
嗨,我碰到过类似的CSV解析坑!问题出在你CSV里的Andrew \末尾的反斜杠——CSV解析器默认会把反斜杠当成转义字符,它会认为后面的逗号(字段分隔符)是被转义的,不属于分隔字段的作用,所以才会报错说“没读到预期的job_level列”;而你之后的替换操作是在解析错误的DataFrame上做的,自然会把合并的字段变成Andrew,SSE,第二列就成了NaN。
下面给你两个靠谱的解决方法:
方法一:读取前先处理原始CSV内容(推荐)
先从S3把文件内容读出来,提前把字段末尾的反斜杠去掉,再交给pandas解析:
import boto3 import pandas as pd import re from io import StringIO # 初始化S3客户端 s3 = boto3.client('s3') bucket_name = "你的S3桶名" file_key = "你的CSV文件路径" # 读取S3上的CSV原始内容 obj = s3.get_object(Bucket=bucket_name, Key=file_key) raw_csv = obj['Body'].read().decode('utf-8') # 正则替换:匹配字段末尾的反斜杠(不管后面是逗号还是行尾) processed_csv = re.sub(r'\\(?=\s*,|\s*$)', '', raw_csv) # 把处理后的内容转成可读取的流,再解析成DataFrame df = pd.read_csv(StringIO(processed_csv))
这个正则只会去掉字段末尾的反斜杠,不会影响其他位置的反斜杠(如果有的话),处理后就能得到你想要的结果:
| First_Name | Job_level |
|---|---|
| Andrew | SSE |
| Kyle | SE |
方法二:调整pandas的CSV解析参数
如果你的CSV里没有使用引号包裹字段,可以直接告诉pandas不要把反斜杠当成转义符:
import pandas as pd import csv from io import StringIO # 同样先读取S3文件内容(步骤同方法一) # ... # 读取时设置解析参数 df = pd.read_csv( StringIO(raw_csv), quoting=csv.QUOTE_NONE, # 告诉解析器没有带引号的字段 escapechar=None # 禁用反斜杠的转义功能 )
这个方法更简洁,但如果你的CSV里有带引号的字段,可能会出现新的解析问题,所以更适合字段都没有引号的场景。
备注:内容来源于stack exchange,提问作者Syed Yunus
相关产品推荐
相关产品推荐

