使用rstrip('.csv')处理文件名为何出现异常?
为什么
rstrip('.csv')会意外删除文件名末尾的s? 嘿,这个坑我之前踩过!问题出在你对rstrip()方法的作用理解上——它不是匹配并删除完整的后缀字符串,而是会把传入的参数当作一个字符集合,然后从字符串末尾开始,删除所有属于这个集合里的字符,直到碰到第一个不在集合里的字符为止。
具体到你的例子:
当你调用name.rstrip('.csv')时,传入的字符集合是{'.', 'c', 's', 'v'}。拿"demographics.csv"来说:
- 首先会删除末尾的
.csv,得到"demographics"; - 接着检查这个新字符串的末尾字符
s,发现s属于字符集合{'.', 'c', 's', 'v'},所以继续删除,直到碰到不在集合里的字符(也就是demographic里的c),最终结果就变成了"demographic"。"sat_results.csv"的情况完全一样,末尾的s被误删,得到"sat_result"。
正确的解决方案
处理文件名后缀,最好用专门针对文件名的工具,或者精准匹配后缀的方法:
方法1:使用os.path.splitext()(推荐)
这是Python标准库中专门用来拆分文件名和后缀的方法,兼容性和安全性都拉满:
import os data_files = [ "ap_2010.csv", "class_size.csv", "demographics.csv", "graduation.csv", "hs_directory.csv", "sat_results.csv" ] data_names = [os.path.splitext(name)[0] for name in data_files]
运行后得到的结果就是你想要的:["ap_2010", "class_size", "demographics","graduation","hs_directory", "sat_results"]
方法2:使用str.rpartition()
这个方法会从右往左找第一个匹配的分隔符,然后返回包含前缀、分隔符、后缀的元组,取前缀即可:
data_files = [ "ap_2010.csv", "class_size.csv", "demographics.csv", "graduation.csv", "hs_directory.csv", "sat_results.csv" ] data_names = [name.rpartition('.')[0] for name in data_files]
方法3:切片(仅当确定所有文件都是.csv后缀时可用)
如果能保证所有文件名都以.csv结尾,直接截取前-4位也可以:
data_files = [ "ap_2010.csv", "class_size.csv", "demographics.csv", "graduation.csv", "hs_directory.csv", "sat_results.csv" ] data_names = [name[:-4] for name in data_files]
内容的提问来源于stack exchange,提问作者Tomás R. Pita
相关产品推荐
相关产品推荐

