如何识别Windows目录中包含非ASCII字符的文件路径列表?
需求:打印Windows深层嵌套目录中含非ASCII字符的文件路径列表
已明确的核心逻辑
- 判断非ASCII字符:Unicode编码大于128的字符为非ASCII字符,判断逻辑:
if ord(i) > 128 - 递归遍历目录提取文件路径:
directory = "C:\Temp" [print(os.path.join(dp, f)) for dp, dn, filenames in os.walk(directory) for f in filenames]
尝试结合逻辑的错误写法及报错
错误写法1:直接对文件名调用ord
[print(os.path.join(dp, f)) for dp, dn, filenames in os.walk(directory) for f in filenames if ord(f) < 128]
问题:
ord仅接受单个字符作为输入,此处传入的是完整文件名,逻辑不成立。
错误写法2:列表推导式嵌套语法错误
[print(os.path.join(dp, f)) for dp, dn, filenames in os.walk(directory) for f in filenames if ord([x for x in list(f)] < 128)]
错误代码:TypeError: '<' not supported between instances of 'list' and 'int'
原因:错误地将列表与整数进行比较,语法逻辑不合法。
错误写法3:解包操作使用场景错误
[print(os.path.join(dp, f)) for dp, dn, filenames in os.walk(directory) for f in filenames if ord([x for x in (*f)] < 128)]
错误代码:SyntaxError: can't use starred expression here
原因:在列表推导式中错误使用解包语法,不符合Python语法规则。
错误写法4:循环子句顺序错误
[print(os.path.join(dp, f)) for dp, dn, filenames in os.walk(directory) for x in f in filenames if ord(x < 128)]
错误代码:NameError: name 'f' is not defined
原因:循环子句顺序混乱,f在未定义的情况下被引用。
已有移除非ASCII字符的代码(需先获取待修改文件列表)
def remove_non_ascii_1(text): return ''.join(i for i in text if ord(i) < 128) [os.rename(os.path.join(dp, f), remove_non_ascii_1(os.path.join(dp, f))) for dp, dn, filenames in os.walk(directory) for f in filenames]
内容的提问来源于stack exchange,提问作者oymonk
相关产品推荐
相关产品推荐

