如何在Python中从文件名中提取数字?

14

我需要从文件名中提取数字,例如:

GapPoints1.shp

GapPoints23.shp

GapPoints109.shp

如何使用Python从这些文件中提取数字? 我需要将其结合到一个for循环中。

4个回答

27

你可以使用正则表达式:

regex = re.compile(r'\d+')

然后获取匹配的字符串:

regex.findall(filename)

这将返回一个包含数字的字符串列表。如果您实际上需要整数,可以使用 int

[int(x) for x in regex.findall(filename)]
如果每个文件名中只有一个数字,您可以使用regex.search(filename).group(0)(如果您确定它会产生匹配)。 如果没有找到匹配项,上述行将生成一个AttributeError,指出NoneType没有属性group

5
所以,您没有留下这些文件的位置和获取方式的描述,但我假设您将使用 os 模块获取文件名。
至于从名称中获取数字,最好使用带有re的正则表达式,类似于这样:
import re
def get_numbers_from_filename(filename):
    return re.search(r'\d+', filename).group(0)

然后,为了在for循环中包含它,您需要对每个文件名运行该函数:
for filename in os.listdir(myfiledirectory):
   print get_numbers_from_filename(filename)

或者类似于这样的东西。

5

如果只有一个数字:

filter(lambda x: x.isdigit(), filename)

0
这是我用来将论文发表年份放在文件名开头的代码,当文件从谷歌学术下载后。主要文件通常构建为:作者+发表年份.pdf,因此通过实现这个代码,文件名将变为:发表年份+作者.pdf。
# Renaming Pdf according to number extraction
# You want to rename a pdf file, so the digits of document published year comes first.
# Use regular expersion
# As long as you implement this file, the other pattern will be accomplished to your filename.

# import libraries
import re
import os

# Change working directory to this folder
address = os.getcwd ()
os.chdir(address)

# defining a class with two function
class file_name:
    # Define a function to extract any digits
    def __init__ (self, filename):
        self.filename = filename

    # Because we have tow pattern, we must define tow function.
    # First function for pattern as : schrodinger1990.pdf
    def number_extrction_pattern_non_digits_first (filename):

        pattern = (r'(\D+)(\d+)(\.pdf)')
        digits_pattern_non_digits_first = re.search(pattern, filename, re.IGNORECASE).group (2) 
        non_digits_pattern_non_digits_first = re.search(pattern, filename, re.IGNORECASE).group (1)
        return digits_pattern_non_digits_first, non_digits_pattern_non_digits_first

    # Second function for pattern as : 1993schrodinger.pdf
    def number_extrction_pattern_digits_first (filename):

        pattern = (r'(\d+)(\D+)(\.pdf)')
        digits_pattern_digits_first = re.search(pattern, filename, re.IGNORECASE).group (1) 
        non_digits_pattern_digits_first = re.search(pattern, filename, re.IGNORECASE).group (2)

        return digits_pattern_digits_first, non_digits_pattern_digits_first



if __name__ == '__main__':

    # Define a pattern to check filename pattern
    pattern_check1 = (r'(\D+)(\d+)(\.pdf)')

    # Declare each file address.
    for filename in os.listdir(address):

        if filename.endswith('.pdf'):
            if re.search(pattern_check1, filename, re.IGNORECASE):

                digits = file_name.number_extrction_pattern_non_digits_first (filename)[0]
                non_digits = file_name.number_extrction_pattern_non_digits_first (filename)[1]
                os.rename(filename, digits + non_digits + '.pdf')

            # Else other pattern exists.    
            else :

                digits = file_name.number_extrction_pattern_digits_first (filename)[0]
                non_digits = file_name.number_extrction_pattern_digits_first (filename)[1]
                os.rename(filename, digits + non_digits + '.pdf')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接