3

所以我正在编写一个带有os模块的通用备份应用程序,pickle到目前为止我已经尝试了下面的代码来查看某个东西是文件还是目录(基于它的字符串输入而不是它的物理内容)。

import os, re

def test(path):
    prog = re.compile("^[-\w,\s]+.[A-Za-z]{3}$")
    result = prog.match(path)
    if os.path.isfile(path) or result:
        print "is file"
    elif os.path.isdir(path):
        print "is directory"
    else: print "I dont know"

问题

test("C:/treeOfFunFiles/")
is directory
test("/beach.jpg")
I dont know
test("beach.jpg")
I dont know
test("/directory/")
I dont know

期望的输出

test("C:/treeOfFunFiles/")
is directory
test("/beach.jpg")
is file
test("beach.jpg")
is file
test("/directory/")
is directory

资源

我应该使用什么正则表达式来区分可能是 afile和可能是 a之间的区别directory?还是有其他方法可以解决这个问题?

4

3 回答 3

5

os模块提供了检查路径是文件还是目录的方法。建议将此模块用于正则表达式。

>>> import os
>>> print os.path.isfile(r'/Users')
False
>>> print os.path.isdir(r'/Users')
True
于 2012-10-17T00:13:57.763 回答
4

这可能对某人有帮助,我有完全相同的需求,我使用以下正则表达式来测试输入字符串是目录、文件还是两者都不是:对于通用文件:

^(\/+\w{0,}){0,}\.\w{1,}$

对于通用目录:

^(\/+\w{0,}){0,}$

所以生成的python函数看起来像:

import os, re

def check_input(path):
    check_file = re.compile("^(\/+\w{0,}){0,}\.\w{1,}$")
    check_directory = re.compile("^(\/+\w{0,}){0,}$")
    if check_file.match(path):
        print("It is a file.")
    elif check_directory.match(path):
        print("It is a directory")
    else:
        print("It is neither")

例子:

  • check_input("/foo/bar/file.xyz") 打印 -> 是文件
  • check_input("/foo/bar/directory") 打印 -> 是一个目录
  • check_input("Random gibberish") 打印 -> 两者都不是

这层输入的安全性可能会在稍后通过 os.path.isfile() 和 os.path.isdir() 内置函数得到加强,正如 Squig 先生亲切地展示的那样,但我敢打赌这个初步测试可能会为你节省一些微秒并提高您的脚本性能。

PS:在使用这段代码时,我注意到我错过了一个巨大的用例,因为路径实际上包含特殊字符,例如广泛使用的破折号“-”。为了解决这个问题,我更改了 \w{0,} ,它使用 .{0,} 指定仅字母单词的要求,这只是一个随机字符。这更像是一种解决方法而不是解决方案。但这就是我现在所拥有的。

于 2015-12-16T10:54:45.440 回答
3

在字符类中,如果存在并表示为连字符,则-需要是第一个/最后一个字符,或者转义,例如\-更改"^[\w-,\s]+\.[A-Za-z]{3}$""^[-\w,\s]+\.[A-Za-z]{3}$"

否则,我认为使用正则表达式来确定看起来像文件名/目录的东西是没有意义的......

  • /dev/fd0例如不是文件或目录
  • ~/comm.pipe可能看起来像一个文件,但它是一个命名管道
  • ~/images/test是指向名为“~/images/holiday/photo1.jpg”的文件的符号链接

查看os.path具有询问操作系统的功能的模块......:  

于 2012-10-17T00:14:25.990 回答