Python 按标准验证文件名

Python 按标准验证文件名,python,Python,我对python脚本编写相当陌生,我想验证目录和子目录中的文件名。 验证应区分大小写。 我正在使用python 2.6.5 操作系统:win7和xp 我提示输入以下用户输入: prompt = "year" year = raw_input(prompt) prompt = "number" number = raw_input(prompt) 我想从这里搜索/验证以下文件和文件夹是否存在,以及它们的文件名是否正确 折叠结构: ..\foobar_(number)_version1\music

我对python脚本编写相当陌生,我想验证目录和子目录中的文件名。 验证应区分大小写。 我正在使用python 2.6.5 操作系统:win7和xp

我提示输入以下用户输入:

prompt = "year"
year = raw_input(prompt)
prompt = "number"
number = raw_input(prompt)
我想从这里搜索/验证以下文件和文件夹是否存在,以及它们的文件名是否正确

折叠结构:

..\foobar_(number)_version1\music
子文件夹“音乐”中的文件

(year)_foobar_(number)_isnice.txt
(year)_itis(number)hot_today.txt
(year)_anything_is(number)possible.txt
(year)_something_{idont_want_to_check_this_part}_(number)_canbe_anything.txt
请注意,所有包含下划线的文本都是相同的,因此应该总是正确的,除了()或{}之间的内容。 我想将结果输出到一个txt文件,该文件将报告文件名是否正确

最符合逻辑的归档方法是什么? 我已经阅读了lib文档fnmatch(.fnmatchcase)、RE和os(.path.isfile)并在这里搜索了一些示例,但我不知道从哪里开始,如何开始

谁能给我指出正确的方向吗

[编辑] 一旦我的脚本具备了工作基础,我就会发布代码以供参考或帮助他人

[edit2]我的第一个非hello world脚本

import os
import re

#output :
file_out = "H:\\output.txt"
f_out = open(file_out, 'w')

print "-------start-script----------"

#input
prompt = "enter 4 digit year: "
year = raw_input(prompt)
prompt = "enter 2 digit number: "
number = raw_input(prompt)

print "the chosen year is %s" % (year)
print "the chosen number is %s" % (number)

f_out.write ("start log!\n")
f_out.write ("------------------------------------------\n")
f_out.write ("the chosen year is %s\n" % (year))
f_out.write ("the chosen number is %s\n" % (number))

#part i'm working on

print "end script"
f_out.write ("------------------------------------------\n")
f_out.write ("end script\n")

#close file
f_out.close()

查看glob模块-这将帮助您获得当前目录中的文件列表:

import glob

year = raw_input('Year: ')        # Example: Year: 2009
number = raw_input('Number: ')    # Example: Number: 12
filenames = glob.glob('{year}_*{number}*'.format(year=year, number=number))
文件名将是当前目录中满足以下条件的任何内容:

  • 以2009年开始
  • 任意数量的字符,直到匹配
    12
  • 12
    后面的任意字符数
  • os.path.exists
    是检查文件是否存在的好方法,或者
    os.path.isfile
    如果您想确保它确实是一个文件,而不是一个名为文件的目录。对于Python3,检查一下,就像上面所说的,如果你计划做任何事情,除了验证它们的存在,还要小心种族条件


    根据您的评论,这似乎是正则表达式的工作。您需要编写的伪代码如下所示:

    for filename in list of filenames:
        if filename is not valid:
            print "<filename> is not valid!"
    
    import os
    import re
    
    pattern = 'Put your actual pattern here'
    
    # For a different directory, change the . to whatever the directory should be
    for filename in os.listdir('.'):
        if not re.match(pattern, filename):
            print("Bad filename: ", filename)
    

    这不是一个完整的答案,而是@Wayne Werner答案的延伸。我还没有足够的声望来评论;0

    我认为韦恩使用格式的方法指向了你应该做的事情,因为它是 在生成文件之前而不是之后验证文件名。看来这就是你在做的,你能控制吗

  • 我会尽可能多地在用户输入级别进行验证
  • 验证从何处获得的其他部件
  • 用这些部分编一本词典
  • 生成您的文件名 例如,在用户输入级别,类似于:

    yourDict = dict() 
    
    year_input = raw_input('What is the year'?)
    
    if not year_input.isdigit():  
        year_input = raw_input('Only digits please in the format YYYY, example: 2012'):
    
    yourDict[year] = year_input
    
    然后继续向dict添加key:values,方法是根据您拥有的任何标准验证其他值。(使用re模块或提及的其他方法)

    然后,正如Wayne所做的那样,使用.format()和传入的字典映射到正确的部分

    format1 = "{year}{part1}{number}{part2}.txt".format(**yourDict)
    
    该方法还允许您使用相同的部分快速构建新格式,并且您可以在字典中为每种格式选择需要或不需要的键


    希望这会有帮助

    除了文件不存在之外,IOError还可能由于多种原因而出现。不过需要注意的是,只有当运行脚本的人具有文件的读取权限时,IOError才能正常工作。@Kos这是正确的,但根据此线程-os.path.exists()可能会导致潜在的安全漏洞Yeah,我已经看到了这一点,这确实是一种误导。这句话本身并没有带来任何危险。一个安全漏洞出现在您检查一次并一直假设它以后仍然存在/不存在的情况下。最好将其作为注释提及,因为OP除了验证文件是否存在以及名称是否正确之外,没有特别提及任何内容。您好,感谢您的回答。但我想确保从年份到数字之间的一切都是正确的。例如,在文件“(year)\u foobar(number)\u isnice.txt”中,“foobar”和“\u isnice.txt”部分也应该被选中。因此,如果我有一个像“(year)\u foobar(number)\u isbad.txt”这样的文件,它应该报告它是不正确的(因为它不符合要求的部分“\u isnice.txt”。希望我解释正确,英语不是我的主要语言。嗨,你能举一个使用两个原始输入(year,number)中任何一个的例子吗在模式字符串中?我搜索了一些示例,但找不到任何有效的方法。我需要re.compile/re.group部分吗?@Ruud,
    re.compile
    只会使正则表达式运行得更快。如果您是针对大量(>1000?)执行此操作的话然后你可以尝试使用re.compile进行模式编译。我会先正常运行它,如果它看起来很慢,你可以尝试进行优化。
    re.group
    只显示匹配的不同部分-在这种情况下,你只需要关心整个模式是否匹配。我刚刚修改了我的第一个示例,使用
    raw\u input
    来获取年份/数字如果我是对的,您首先必须将输入转换为可以使用的字符串,如“.format(year=year,number=number)”部分中的字符串?谢谢你,我会尝试一下,虽然我还需要学习很多,但现在我已经开始理解了:)是的。正则表达式模式只是一个字符串,所以如果您想在其中添加您自己的值(可能会更改),则需要连接或格式化字符串。当然,这取决于用例,但对于很少改变的值,我会使用一个“常量”(即
    YEAR=2009
    NUMBER=13
    )并在每次运行时改变它。对于将多次更改的值(一次针对多个年份/数字对运行),我可能会有一个输入文件并从中读取值。但是,如果你只有几个值,或者你想重新运行尝试不同的值,我会选择交互式路线。
    format1 = "{year}{part1}{number}{part2}.txt".format(**yourDict)