[Python]目录遍历

临近毕业,做了很多网申,有些公司网申需要做测评,题目也比较有意思.下面一个是某公司的一个测评,题目如下:

您将下载到一个压缩包,您需要:

1. 设法找到合适的工具,解压缩这个压缩包,这个压缩包里有很多的文件和文件夹。

2. 解压得到的这些文件它们实际上是图片,而且有很多图片是彼此重复的。

3. 需要您设法筛掉所有彼此相同的图片们,只剩下与任何一张其它图片都不相同的图片。

4. 这张图片的内容应该包括 A:数字 B:数字 C:数字 D:数字….,您需要按照 ABCDE这样的顺序将数字排列起来,得到一串数字。

5. 最后的答案就是这张图片的 文件名(不算后缀):上一步骤得到的一串数字 。

例如:您找到的独一无二图片是“dyBUCPs”文件夹下面的“rFv5aQAA”,且里面的文字有“A:0 B:4 E:9 G:1 C:2 D:5”。那么答案是“rFv5aQAA:042591”。

点此下载压缩包

 

然后说说我的思路:

看到题目后当然首先是下载压缩包,发现是.xz的压缩包,在网上查了一下,发现可以用7-Zip解压缩,于是下载7-Zip解压后,得到一个.tar的压缩包,继续解压,得到文件夹.发现里面有几百个子文件夹,如图所示:

然后发现每个子文件夹里都有一个没有后缀的文件,题目中说是图像文件,于是修改后缀为jpg打开,发现图像为如下形式:

然后,我就想,题目中要我们找唯一一张不重复的图,那么,第一,它的大小是不是唯一的,如果存在大小唯一的文件,那么这个就是我们要找的文件了.第二,它是在每个子文件夹下的,必然要遍历所有目录获得每个文件的路径.这时,我想起之前看过的<可爱的python>一书中某个遍历U盘的例子,想到利用python可以很方便的遍历某个文件夹下所有文件的路径和大小,于是我便上网查询相关信息,很凑巧的是一下子就搜到了源代码,如下:
import os,time
from stat import *
#输入存入日志的文件名
logName = raw_input(‘Input the name of log:’)
log=file(logName,’w’)
#递归遍历文件
def walktree(top, callback):
for log in os.listdir(top):
pathname = os.path.join(top, log)
mode = os.stat(pathname)[ST_MODE]
if S_ISDIR(mode):
# It’s a directory, recurse into it
walktree(pathname, callback)
elif S_ISREG(mode):
# It’s a file, call the callback function
callback(pathname)
else:
# Unknown file type, print a message
print ‘Skipping %s’ % pathname
def visitfile(file):
size = os.path.getsize(file)
mt = time.ctime(os.stat(file).st_mtime);
ct = time.ctime(os.stat(file).st_ctime);
print ‘visiting’, mt ,ct,size, file
log.write(str(size) + ‘t’+’@’+file+’*’+’n’)

if __name__ == ‘__main__’:
#walktree(sys.argv[1], visitfile)
walktree(‘.’, visitfile)

保存在要遍历的目录下运行,得到一个日志文件,日志文件第一列为文件大小,第二列为文件路径.
之后发现,存在唯一的文件大小,于是它就是我们要找的文件.
到此为止,我们解决了这个问题.
但是,如果那个唯一的图像文件大小和其他文件一样,那么,我该如何去解这道题目呢?
稍微讲个思路吧.
首先,忽略图片大小,如何判断两张图片不一样?
大概有这么几种解法:
1.图像想减,如果输出图像像素点都为0,那么图像相等,如果不都为0,则图像不同.
2.扫描两幅图像,如果对应像素点阈值不相同,则两图像不同,如果扫描完毕没有不同阈值的像素点,
则两图像相同.
3.比较直方图.
大概就能想到这3个,主要思想还是对图像像素点做处理然后比较.而且第3种方法有一定风险.
于是,我们可以将所有相同大小的图像分成一组,然后两个两个作比较,如果发现相同,则这两幅图像
都被排除,如果发现不同,再从这一组图像中取一幅比较,就可以得到唯一的那幅图像.
最后,问题再上升一个层次,如果所有图像大小相同,该如何求解.
我觉得,应该还是上述思路,只是作比较的次数增加,效率降低,但总能求出最后答案的.

发表评论

您的电子邮箱地址不会被公开。