我从服务器上下载了一些pdf和csv文件,很多时候这些文件都是空的。我必须手动检查所有这些文件。通常,我一天会收到80-90个文件,并且我打算为此编写一个python脚本。
我尝试了以下代码。
import os
os.stat("Book1").st_size == 0
但是由于空的excel文件的大小也为8 KB,因此无法正常工作。 对于pdf文件,情况也会有所不同。
我想在一个新的txt文件中获取空白文件的所有名称。
答案 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))