【问题标题】:How can I separate the numeric parts of filenames using Python?如何使用 Python 分隔文件名的数字部分?
【发布时间】:2013-07-01 11:51:21
【问题描述】:

我正在尝试编写一个简短的程序来查看目录,获取图像文件的文件名,并附加它们以匹配其目录的名称,并对它们进行重新编号和排序以供以后处理。到目前为止,我可以使用以下方法获取文件夹的名称,并用它替换文件名的特定部分;

import os

print os.getcwd()
str = os.getcwd()
ext =  str.split("/")[-1]
print ext

separ = os.sep
folder = str
for n in os.listdir(folder):
    print n
    if os.path.isfile(folder + separ + n):
        filename_zero, extension = os.path.splitext(n)
        os.rename(folder + separ + n , folder + separ + filename_zero.replace('image',ext) + extension)

for n in os.listdir(folder):
    print n

我不能自己获取数字部分。我的文件名是storm000045.tiff 类型的,我从来没有下划线或圆点来分隔它们。任何建议表示赞赏。提前致谢!

【问题讨论】:

    标签: python split filenames


    【解决方案1】:

    使用这个简单的函数:

    import re
    def get_name_and_number(text):
        return re.match(r'(\D+)(\d+).*', text).groups()
    

    例子:

    >>> get_name_and_number('storm000045.tiff')
    ('storm', '000045')
    

    或者这个:

    def extract_numbers(text):
        return ''.join([x for x in text if x.isdigit()])
    

    例子:

    >>> extract_numbers('storm000045.tiff')
    '000045'
    

    【讨论】:

    • 加入列表更快.... :) 准时检查example
    【解决方案2】:

    使用re

    >>> import re
    >>> re.split('(\d+)', 'torm000045.tiff')
    ['torm', '000045', '.tiff']
    >>> re.split('(\d+)', 'torm000_045.tiff')
    ['torm', '000', '_', '045', '.tiff']
    >>> re.split('(\d+)', 'torm000_045.tiff')[1::2]
    ['000', '045']
    

    第 2、4、6 个元素是数字部分。

    【讨论】:

      【解决方案3】:

      您可以使用字符串模块 translate()。但问题是解决方案会从字符串中取出所有数字。解决方案不包括任何在数字后有字母的检查。如果你的格式是 xxxxdddd.ext 那么应该可以工作。

      def translate(s, table, [deletechars]):返回字符串的副本,其中所有字符都已使用 table 翻译。如果 deletechars 存在,那么它会删除 deletechars 中存在的所有字符。

      translate

      def maketrans(from, to):创建一个供 translate() 使用的表。

      maketrans

      >>> import string
      >>>
      >>>
      >>> # Create table for translate where from string quals with to string
      ...
      >>> s = string.maketrans('', '')
      >>>
      >>> # Need to create delete chars (execpt digits)
      ...
      >>> d = s.translate(s, string.digits)
      >>>
      >>> # We can use d and s for taking out digits from a string
      ...
      >>> x = 'asdffasd23424'
      >>> x.translate(s, d)
      '23424'
      >>> x = 'asdf33433as444'
      >>> x.translate(s, d)
      '33433444'
      >>>
      

      【讨论】:

      • 您可以只使用None 而不是创建s,而是提前创建所有这些东西,您可以运行from string import ascii_letters; x.translate(None, ascii_letters)
      【解决方案4】:
      >>> a = "storm000045.tiff"
      >>> print a[5:11]
      000045
      

      【讨论】:

        猜你喜欢
        • 2018-06-19
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        相关资源
        最近更新 更多