【问题标题】:os.makedirs wrongly catches extension-less files for directory on macOSos.makedirs 错误地捕获 macOS 上目录的无扩展名文件
【发布时间】:2019-12-16 08:44:57
【问题描述】:

我正在尝试创建与文件同名的目录。有一个文件:readme,它没有扩展名。它在声称该文件存在的os.makedirs(directory) 中被捕获。

source = "Users/me/Desktop/parent"
dirpaths = ['readme', 'index', 'robots']

def func(directory,source=source):
   directory = os.path.join(source,directory) #
   os.makedirs(directory)

a = [func(directory) for directory in dirpaths]
>>> FileExistsError: [Errno 17] File exists: '/Users/me/Desktop/parent/readme'

我把带#的那一行改成了:

directory = os.path.join(source,directory+"/")
>>> NotADirectoryError: [Errno 20] Not a directory: '/Users/me/Desktop/parent/readme/'

当存在同名无扩展名文件时,如何创建目录?

Python 3.7.3

事实证明,macOS 将目录和无扩展名文件视为相同。我尝试将一个名为 readme 的文件夹移动到 parent,但它拒绝了。

os.path.isfile(source + "/" + "readme") 
True 
os.path.isfile(source + "/" + "readme/") 
False 
os.path.isdir(source + "/" + "readme/") 
False 
os.path.isdir(source + "/" + "readme") 
False

如果这里有区别,是否也可以用于创作?

【问题讨论】:

    标签: python macos directory file-extension


    【解决方案1】:

    目录只是特殊类型的文件。具体来说,它们只是file mode bits 表示该文件是一个目录的文件(参见位掩码stat.S_ISDIR)。例如,作为八进制数的目录模式通常可能是 0o40755 和常规文件 0o100644

    在大多数文件系统(包括 macOS)上,同一目录中可能没有目录和同名的常规文件,也可能没有包含路径分隔符的文件名。这与 s3 等对象存储形成对比,后者不是实际上是文件系统。

    您自己看看,无论您是否指定尾部斜杠,都会采用相同的inode

    >>> import os
    >>> os.makedirs("./example")
    >>> os.stat('./example/').st_ino == os.stat('./example').st_ino
    True
    

    【讨论】:

    • "您可能没有目录和带有"常规文件的常规文件?我认为robots.txt 是常规的。 readme 不规则。
    • "Regular file" 有一个非常具体的含义,表示不是目录、符号链接、特殊设备等。它与文件名根本没有关系。
    • os.path.isfile(source + "/" + "readme") True os.path.isfile(source + "/" + "readme/") False os.path.isdir(source + "/" + "readme/") 错误 os.path.isdir(source + "/" + "readme") 错误。为了可读性:i.stack.imgur.com/FCa2U.png不能利用这种差异吗?
    • 我建议你 print(os.path.isfile.__doc__) 看看它在那里实际做了什么。
    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2020-09-12
    • 2018-04-14
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多