如何从文件夹中的一堆Excel文件中找出空文件?

时间:2019-07-19 14:04:45

标签: python excel python-3.x pdf

我从服务器上下载了一些pdf和csv文件,很多时候这些文件都是空的。我必须手动检查所有这些文件。通常,我一天会收到80-90个文件,并且我打算为此编写一个python脚本。

我尝试了以下代码。

import os
os.stat("Book1").st_size == 0

但是由于空的excel文件的大小也为8 KB,因此无法正常工作。 对于pdf文件,情况也会有所不同。

我想在一个新的txt文件中获取空白文件的所有名称。

1 个答案:

答案 0 :(得分:0)

这是一个非常广泛的问题,一开始的信息非常有限。假设您只处理csv和pdf文件格式,则最好的选择是:获取文件大小并将其与空文件的大小进行比较。对于csv,在我的计算机(Windows 10)上,最小文件大小为5字节,而对于pdf文件,最小文件大小为178161字节。该大小可能会有所不同,具体取决于:OS(Unix,Windows),文件的创建方式,使用的编码,定界符(用于csv)等。首先考虑文件是否有效也很重要。如果您可以控制这些参数,那么下面的脚本应该会有所帮助。

以下脚本已针对包含空和非空pdf,csv,txt,mp4文件的文件夹中的77个文件进行了测试。使用threading时,脚本执行速度很快,只需大约1秒钟即可显示文件,文件名,是否显示文件为空的打印消息的计数,并将空文件的文件路径附加到空列表并写入文本文件。最后,可以打印空文件名以进行验证。该脚本利用os模块导航文件夹路径,并假定文件夹中仅存在“文件”。已经对csv和pdf文件进行了必要的检查。

只需在脚本底部的path = r'path_to_folder'中提供文件夹路径。

csv和pdf以外的文件的空文件检查逻辑

答案here之一启发了逻辑。我们执行显式检查文件是否包含任何内容。为此,必须打开文件,with上下文管理器确保最后关闭文件句柄。当然,也可以进行检查以确保仅有效的文件路径传递到open()

注意:将代码作为脚本文件运行,例如python empty_file_check.py

import os
import threading
import csv
from time import perf_counter


def empty_file_checker(folder_path):
    """Check for empty files in folder 'folder_path'. 
       Assuming only files exist in the folder.
       :param folder_path: folder path of type str"""

    print("Empty File checker begins...")
    empty_filenames = []
    if os.path.exists(folder_path):
        print("There are {} files in the folder.".format(len(os.listdir(r'{}'.format(folder_path)))))
        for file in os.listdir(folder_path):
            full_path = os.path.join(folder_path, file)            
            if os.path.exists(full_path):
                if full_path.endswith('.csv'):
                    csvsize = os.path.getsize(full_path)
                    #compare with size of empty csv file
                    if csvsize == 5:
                        print("CSV file {} is empty.".format(full_path))
                        empty_filenames.append(full_path)
                    else:                        
                        print("CSV file {} is not empty.".format(full_path))
                elif full_path.endswith('.pdf'):
                    pdfsize = os.path.getsize(full_path)
                    #compare with size of empty pdf file
                    if pdfsize == 178161:
                        print("PDF file {} is empty.".format(full_path))
                        empty_filenames.append(full_path)
                    else:                        
                        print("PDF file {} is not empty.".format(full_path))                    
                else:
                    with open(full_path) as f:
                        f.seek(0, os.SEEK_END)
                        if f.tell():
                            f.seek(0)
                            print(f'File {file} is not empty')
                        else:
                            empty_filenames.append(full_path)
                            print(f'File {file} is empty.')
            else:
                print(f'File {file} does not exist in {folder_path}.')
    else:
        print(f'Folder {folder_path} does not exist. Please check the path and try again.')
    #write filepaths of empty files to a txt file
    with open("empty_filenames.txt", 'w') as fw:
        for i in empty_filenames:
            fw.write(i + "\n")        
    print("Empty filenames: {}".format(empty_filenames))

if __name__=='__main__':
    start = perf_counter()       
    path = r'path_to_folder'
    x = threading.Thread(target=empty_file_checker, args=(path,))    
    x.start()  
    x.join()    
    end = perf_counter()
    interval = end - start
    print("Script execution time: {}".format(interval))