【问题标题】:Get folder name of the file in Python在Python中获取文件的文件夹名称
【发布时间】:2016-01-27 02:31:23
【问题描述】:

在 Python 中,我应该使用什么命令来获取包含我正在使用的文件的文件夹的名称?

"C:\folder1\folder2\filename.xml"

这里"folder2"是我想要的。

我想出的唯一方法是使用os.path.split 两次:

folderName = os.path.split(os.path.split("C:\folder1\folder2\filename.xml")[0])[1]

有没有更好的办法?

【问题讨论】:

标签: python python-3.x directory


【解决方案1】:

你可以使用dirname:

os.path.dirname(path)

返回路径名路径的目录名。这是第一个元素 通过将路径传递给函数 split() 返回的对。

并且给定完整路径,然后您可以正常拆分以获取路径的最后一部分。例如,通过使用basename:

os.path.basename(path)

返回路径名路径的基本名称。这是第二个元素 通过将路径传递给函数 split() 返回的对。注意 此函数的结果与 Unix 基本名称不同 程序;其中 '/foo/bar/' 的 basename 返回 'bar',basename() 函数返回一个空字符串 ('')。


大家一起:

>>> import os
>>> path=os.path.dirname("C:/folder1/folder2/filename.xml")
>>> path
'C:/folder1/folder2'
>>> os.path.basename(path)
'folder2'

【讨论】:

    【解决方案2】:

    os.path.dirname 就是你要找的 -

    os.path.dirname(r"C:\folder1\folder2\filename.xml")
    

    确保在字符串前面加上r,以便将其视为原始字符串。

    演示 -

    In [46]: os.path.dirname(r"C:\folder1\folder2\filename.xml")
    Out[46]: 'C:\\folder1\\folder2'
    

    如果你只想要folder2,你可以使用os.path.basename上面的例子-

    os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
    

    演示 -

    In [48]: os.path.basename(os.path.dirname(r"C:\folder1\folder2\filename.xml"))
    Out[48]: 'folder2'
    

    【讨论】:

      【解决方案3】:

      您希望使用dirname。如果你只想要那个目录,可以使用os.path.basename

      把所有东西放在一起看起来像这样:

      os.path.basename(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))
      

      这应该让你“other_sub_dir”

      以下不是理想的方法,但我最初提出,使用os.path.split,并简单地获取最后一项。看起来像这样:

      os.path.split(os.path.dirname('dir/sub_dir/other_sub_dir/file_name.txt'))[-1]
      

      【讨论】:

        【解决方案4】:

        这已经很老了,但如果您使用的是 Python 3.4 或更高版本,请使用PathLib

        # using OS
        import os
        path=os.path.dirname("C:/folder1/folder2/filename.xml")
        print(path)
        print(os.path.basename(path))
        
        # using pathlib
        import pathlib
        path = pathlib.PurePath("C:/folder1/folder2/filename.xml")
        print(path.parent)
        print(path.parent.name)
        

        【讨论】:

          【解决方案5】:

          您可以将完整路径作为字符串获取,然后使用操作系统的分隔符将其拆分为列表。 然后,您可以通过使用负索引从列表末尾访问元素来获取程序名称、文件夹名称等。

          像这样:

          import os
          strPath = os.path.realpath(__file__)
          print( f"Full Path    :{strPath}" )
          nmFolders = strPath.split( os.path.sep )
          print( "List of Folders:", nmFolders )
          print( f"Program Name :{nmFolders[-1]}" )
          print( f"Folder Name  :{nmFolders[-2]}" )
          print( f"Folder Parent:{nmFolders[-3]}" )
          

          上面的输出是这样的:

          Full Path    :C:\Users\terry\Documents\apps\environments\dev\app_02\app_02.py
          List of Folders: ['C:', 'Users', 'terry', 'Documents', 'apps', 'environments', 'dev', 'app_02', 'app_02.py']
          Program Name :app_02.py
          Folder Name  :app_02
          Folder Parent:dev
          

          【讨论】:

            【解决方案6】:

            你可以使用 pathlib

            from pathlib import Path
            Path(r"C:\folder1\folder2\filename.xml").parts[-2]
            

            上面的输出是这样的:

            'folder2'
            

            【讨论】:

              【解决方案7】:

              我使用 2 种方法来获得相同的响应: 其中一个使用:

                 os.path.basename(filename)
              

              由于我在脚本中发现的错误,我改为:

              Path = filename[:(len(filename)-len(os.path.basename(filename)))]
              

              由于 python 的'\\',这是一种解决方法

              【讨论】:

                【解决方案8】:

                我对可用的解决方案进行了改进,即适用于所有解决方案的 sn-p,

                1. 文件
                2. 带有训练斜线的目录
                3. 没有训练斜线的目录

                我的解决方案是,

                from pathlib import Path
                
                def path_lastname(s):
                    Path(s).with_name("foo").parts[-2]
                

                说明

                • Path(s) - 从s 创建一个自定义 Path 对象而不解析它。

                • .with_name("foo") - 将假文件 foo 添加到路径

                • .parts[-2] 返回字符串的倒数第二部分。 -1 部分将是 foo

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-01-16
                  • 1970-01-01
                  • 2020-12-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-02-16
                  相关资源
                  最近更新 更多