【问题标题】:How do I figure out how to count files with 'no extention' seperately我如何弄清楚如何单独计算没有扩展名的文件
【发布时间】:2023-02-06 15:11:18
【问题描述】:

有些文件根本没有扩展名,我需要弄清楚如何将它们算作“无扩展名”类型

import os
extension_count = {}
# no_extention_count = {}
for filename in os.listdir('/Users/saraAlbertt/Downloads'):
    pieces = filename.split('.')
    # print(pieces)
    extension = pieces[-1]
    # print(extension)
    if extension not in extension_count:
        extension_count[extension] = 1
    else:
        extension_count[extension] += 1

pieces 是我的文件中的列表,它们被分成字符串,有些具有扩展名,这是列表中的最后一个元素。所有列表都有不同的大小,我需要弄清楚如何不将内部只有一个元素的列表算作扩展。

{'dmg': 2, 'png': 6, 'MP4': 3, 'vtt': 4, 'docx': 12, 'DS_Store': 1, 'dots-game': 1, 'localized': 1 , '下载': 1, 'pptx': 2, 'pkg': 1, 'txt': 4, '世界': 1, 'JPEG': 1, 'crdownload': 3, 'm4a': 1, '应用程序':1,'ppt':1,'jpg':2,'zip':2,'mp4':1}

这是打印 (extention_count) 的结果,但像 Ds-store 这样的文件不是扩展名,看起来像这样 ['DS-store'] 我想从片段中减去扩展以获得无扩展,如果长度等于 1,则将其单独计数为 no_extention_count = {}

【问题讨论】:

  • 您可以使用 if not left 检查拆分后两边是否为空,以验证它不是以点开头的文件名。

标签: python list dictionary


【解决方案1】:

我建议看一下os.path.splitext 函数,它会返回一对(根,分机), 后者是空字符串以防万一路径不包含扩展名,考虑以下简单示例

import collections
import os
files = ['file.mp4','file.txt','file']
count = collections.defaultdict(int)
for f in files:
    count[os.path.splitext(f)[-1]] += 1
print(dict(count))

给出输出

{'.mp4': 1, '.txt': 1, '': 1}

请注意,我使用了 collections.defaultdict(int),它允许我将值增加 1,而无需事先检查它是否存在。

【讨论】:

  • 这是否也能解决 OP 描述的问题案例,例如.DS_Store
  • @BRemmelzwaal 我确实在我的 python (3.8) 中运行测试并且 os.path.splitext(".DS_Store") 给出了 ('.DS_Store', '') 即它确实认为 .DS_Store 具有空扩展名。我不知道它是否适用于所有操作系统的所有 python 版本。
  • 我喜欢这个解决方案。真的很短很优雅。
【解决方案2】:

你的意思是这样的吗?:

extension_count = {}
no_extension_count = 0

for filename in os.listdir('/Users/saraAlbertt/Downloads'):
    pieces = filename.split('.')
    # print(pieces)
    
    # If a file had an extension, pieces would equal 2.
    # This only works if you are sure that filenames do not include dots
    if len(pieces) == 1: 
        no_extention_count += 1
        continue

    extension = pieces[-1]
    # print(extension)
    if extension not in extension_count:
        extension_count[extension] = 1
    else:
        extension_count[extension] += 1

【讨论】:

  • 关于这个 if 条件的优雅逻辑,不错的想法
【解决方案3】:

使用 os.path.splitext,去除前导点并检查空扩展名将达到目的:

import os

extension_count = {}
no_extension_count = 0
for filename in os.listdir('/Users/saraAlbertt/Downloads'):
    _, extension = os.path.splitext(filename)
    if not extension:
        no_extension_count += 1
    else:
        extension = extension.lstrip('.')
        if extension not in extension_count:
            extension_count[extension] = 1
        else:
            extension_count[extension] += 1

【讨论】:

  • 谢谢,这行得通,但是如果我想让这些文件转到 no_extension_count 而不是 extension_count 怎么办,因为当前“无扩展”是“无扩展:4”,但在 extension_count 内部
  • @Sara_learningToCode 感谢您接受我的回答。我更新了它,所以没有扩展名的文件名增加了一个单独的int no_extension_count
【解决方案4】:

您可以编写一个简单的 if 检查来检查 pieces 的长度,例如:

if len(pieces) == 1:
   ##Add To "No Extension"
else:
   ##Add to Associated Extension

这应该检查文件是否有扩展名。您也可以在 filename 中查找“.”。在将其拆分之前:

if "." not in filename:
   ###Add to "No extension"

其中任何一个都应该工作。

【讨论】:

    【解决方案5】:

    您可以让 Counter 来自 collections 为您完成繁重的工作,只需一行代码。

    import os
    from collections import Counter
    
    c = Counter(list(map(lambda x: os.path.splitext(x)[1], os.listdir('path/here'))))
    
    print(c)
    Counter({'.py': 14, '.html': 5, '': 5, '.csv': 3})
    

    从这里您可以看到没有扩展名的号码(来自 '' 的键)。

    【讨论】:

      【解决方案6】:

      str.rsplit('.', maxsplit=1) 方法返回长度为一(无扩展名)或二(有扩展名)的列表。

      >>> import os
      >>> os.system('ls /var/log')
      alternatives.log
      apt
      btmp
      dpkg.log
      faillog
      fontconfig.log
      lastlog
      wtmp
      0
      
      >>> from collections import defaultdict
      ...
      ... extension_count = defaultdict(lambda: 0)
      ... no_extension_count = defaultdict(lambda: 0)
      ...
      ... for filename in os.listdir('/var/log'):
      ...     filename_n_ext = filename.rsplit('.', maxsplit=1)
      ...     if len(filename_n_ext) == 1:
      ...         no_extension_count[filename_n_ext[0]] += 1
      ...     else:  # len(filename_n_ext) == 2
      ...         extension_count[filename_n_ext[1]] += 1
      
      >>> no_extension_count
      defaultdict(<function <lambda> at 0x7f33d4d90ee0>, {'faillog': 1, 'apt': 1, 'wtmp': 1, 'lastlog': 1, 'btmp': 1})
      >>> extension_count
      defaultdict(<function <lambda> at 0x7f33d4d90e50>, {'log': 3})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-07
        • 2014-06-11
        • 1970-01-01
        • 2020-01-29
        • 2018-08-15
        • 1970-01-01
        • 2016-05-10
        • 2012-10-05
        相关资源
        最近更新 更多