如何用Python按文件大小搜索文件

2 投票
6 回答
3245 浏览
提问于 2025-04-18 06:43

我遇到麻烦了。我需要用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可以直接从函数返回列表。

撰写回答