Python 按标准验证文件名
我对python脚本编写相当陌生,我想验证目录和子目录中的文件名。 验证应区分大小写。 我正在使用python 2.6.5 操作系统:win7和xp 我提示输入以下用户输入: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
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))
文件名将是当前目录中满足以下条件的任何内容:
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)