如何检查Python中与平台不兼容的文件夹(文件)名称
我想知道怎么用Python检查一个字符串是否可以作为跨平台的文件夹名称。下面是我遇到的具体问题(文件夹名称以点号结尾),但我相信还有其他一些特殊情况(比如:con等)。
有没有相关的库可以用来处理这个问题?
我在Windows(7)上用Python(3.2)创建了一个以点号('.')结尾的文件夹,比如(不带方括号):[我假期做的事情,第二部分.]
当我把这个文件夹通过FTP传到Linux上时,它的名称里就没有点号了(这导致很多超链接失效)。
我在命令行检查了一下,发现这个文件夹的名字里确实没有点号。
mkdir tmp.
dir
cd tmp
cd ..\tmp.
显然,在文件夹名称后面加一个点号是被忽略的,比如:
cd c:\Users.
这样做的效果和预期的一样。
3 个回答
我自己写了一个函数。我是从@Voo的回答开始的,然后根据这个回答添加了一些检查。
def is_valid_folder_name(name: str):
# Define a regular expression pattern to match forbidden characters
ILLEGAL_NTFS_CHARS = r'[<>:/\\|?*\"]|[\0-\31]'
# Define a list of forbidden names
FORBIDDEN_NAMES = ['CON', 'PRN', 'AUX', 'NUL',
'COM1', 'COM2', 'COM3', 'COM4', 'COM5',
'COM6', 'COM7', 'COM8', 'COM9',
'LPT1', 'LPT2', 'LPT3', 'LPT4', 'LPT5',
'LPT6', 'LPT7', 'LPT8', 'LPT9']
# Check for forbidden characters
match = re.search(ILLEGAL_NTFS_CHARS, name)
if match:
raise ValueError(
f"Invalid character {match[0]} for filename {name}")
# Check for forbidden names
if name.upper() in FORBIDDEN_NAMES:
raise ValueError(f"{name} is a reserved folder name in windows")
# Check for empty name (disallowed in Windows)
if name.strip() == "":
raise ValueError("Empty file name not allowed in Windows")
# Check for names starting or ending with dot or space
match = re.match(r'^[. ]|.*[. ]$', name)
if match:
raise ValueError(
f"Invalid start or end character ({match[0]})"
f" in folder name {name}"
)
如果有人发现我漏掉了什么,欢迎随时补充或者评论!
不要在文件或文件夹的名字后面加空格或者句号。虽然底层的文件系统可能支持这样的名字,但Windows的命令行和用户界面是不支持的。
http://msdn.microsoft.com/en-us/library/aa365247.aspx#naming_conventions
那一页会告诉你其他在Windows上不合法的名字,包括你自己提到的CON。
如果你遵守这些(看起来有点严格的)规则,我觉得在Linux和大多数其他系统上也会没问题。
很遗憾,这个问题没有简单的解决办法。在Windows系统上,你可以用下面的代码来去掉所有不合法的字符。不过,如果有人还在用FAT文件系统,你就得考虑这些,因为FAT的规则更严格。基本上,你需要查阅所有文件系统的文档,列出一个完整的非法字符列表。下面是NTFS文件系统的一个起点:
ILLEGAL_NTFS_CHARS = "[<>:/\\|?*\"]|[\0-\31]"
def __removeIllegalChars(name):
# removes characters that are invalid for NTFS
return re.sub(ILLEGAL_NTFS_CHARS, "", name)
然后你还需要一个“禁止使用”的名称列表,以避免使用COM。总之,这事情相当复杂……而且这还不包括Linux系统(不过据我所知,Linux的规则比较宽松)