如何用Python按文件大小搜索文件
我遇到麻烦了。我需要用Python写一段代码,通过文件的大小来找到一个文件,并把它的名字和大小添加到一个列表里。我已经有一个程序可以根据文件名在一个文件夹里搜索文件。现在我需要再加一个选项,用来根据文件大小进行搜索。
import getopt
import sys
import os
from os import listdir, walk
from os.path import isfile, join
def find_by_name(name, path, result): #Define a function to search the file by it's name
result = []
for root, dirs, files in os.walk(path):
if name in files:
result.append(os.path.join(name)) #Join the file to the list called result
else:
print ("Nothing was found by %s" % name)
return result
def main():
path_dir = raw_input("Select the directory you want to search: ")
results = []
try:
opts, args = getopt.getopt(sys.argv[1:], 'n:y:d:')
except getopt.GetoptError as err:
print (err)
sys.exit
for o, a in opts:
if o in ("-n", "--name"):
pro = find_by_name(a, path_dir, results)
if __name__ == "__main__":
main()
6 个回答
1
使用 os.stat 来查找文件大小。
filestats = os.stat(filename)
filesize = filestats.st_size
1
要获取文件的大小,可以使用:
os.path.getsize(path)
这个方法会返回文件的大小,单位是字节。
所以:
def get_files_by_size(path, size):
""" Returns a list of files that are the size provided """
result = []
for root, dirs, files in os.walk(path):
for file in files:
path = os.path.join(root, file)
if os.path.getsize(path) == size:
result.append(path)
return result
1
你可以使用下面的代码来获取文件的大小。
import os
os.path.getsize('./path/to/file')
这样你就可以获取每个文件的大小,然后根据大小对文件进行排序。
3
def matched_files(base_directory):
for root, dirs, files in os.walk(path):
if name in files:
yield os.path.join(root,name) #Join the file to the list called result
print sorted(matched_files("/some/path"),key=os.path.getsize) #sort files matching name by size
我觉得这样做会有效果……而且它可以大大简化你的匹配程序……因为它把程序变成了一个生成器。
如果你想匹配所有大小相同的文件,不管文件名是什么……这可能不是最好的解决办法……但你应该能轻松搞定。
其实如果你想找到所有特定大小的文件……用普通的bash/sed/awk可能效果最好。
3
os.walk可以让你获取文件的路径和文件名。然后你可以使用
stats = os.stat(path+name)
stats.st_size
来获取文件的大小,单位是字节。所以你可以把你现在的函数改成这样:
def find_by_size(size, path):
result = []
for root, dirs, files in os.walk(path):
if os.stat(path+name).st_size == size:
result.append((os.path.join(name), stats.st_size))
else:
print ("Nothing of size %d was found" % size)
return result
另外,你不需要把结果传进去,因为你只是用一个空列表来替换它。Python可以直接从函数返回列表。