pd.read_csv运行报错bytes-like object is required, not 'str'问题咨询
问题原因
- 报错的根因是参数类型不匹配:
subprocess.check_output()默认返回字节类型结果,你调用.decode('utf-8')后已经将其转换为字符串,但io.BytesIO()仅支持接收字节类对象作为输入,传入字符串就会触发*bytes-like object is required, not 'str'*错误。
可行解决方案
提供两种可直接运行的修改方案:
方案1:保留BytesIO,去掉decode步骤
不对返回结果做解码,直接将原始字节传入io.BytesIO:
import subprocess import pandas as pd import io validationColumns='column1|column2' headerColumns = validationColumns.split("|") # 移除末尾的.decode('utf-8'),保留原始字节格式 rawData = subprocess.check_output( 'sshpass -p \'pass\' ssh -o StrictHostKeyChecking=no user tail -n +1 /var/prod/archive/new.txt | awk \'NR==1, NR==35\'', shell=True) df = pd.read_csv(io.BytesIO(rawData), encoding='utf8', sep='|', usecols=headerColumns, quotechar="~")
方案2:保留decode步骤,改用StringIO
如果业务需要先拿到解码后的字符串做其他处理,可以把io.BytesIO替换为适配字符串输入的io.StringIO:
import subprocess import pandas as pd import io validationColumns='column1|column2' headerColumns = validationColumns.split("|") rawData = subprocess.check_output( 'sshpass -p \'pass\' ssh -o StrictHostKeyChecking=no user tail -n +1 /var/prod/archive/new.txt | awk \'NR==1, NR==35\'', shell=True).decode('utf-8') # 替换io.BytesIO为io.StringIO,无需额外指定encoding参数 df = pd.read_csv(io.StringIO(rawData), sep='|', usecols=headerColumns, quotechar="~")
额外提示:代码中明文填写ssh密码存在泄露风险,生产环境建议配置ssh密钥实现免密登录,避免明文写密码。
内容的提问来源于stack exchange,提问作者kaviya .P
相关产品推荐
相关产品推荐

