Python如何处理无扩展名文件?按指定扩展名统计目录文件行数问题
问题修复方案
1. 无扩展名文件匹配修复
你之前加空白行导致所有文件被统计的核心原因是:空字符串作为endswith的参数时,任意字符串都会返回True,所以不能直接用空白行匹配无扩展名文件。
修改方案:
- 读取扩展名列表时先过滤空行和首尾空白字符
- 单独增加无扩展名文件的判断逻辑,用特殊标记(比如
__NO_EXT__)在配置文件中指定是否匹配无扩展名文件,避免误操作。
2. 目录排除功能修复
原代码中dirpath not in DIRS_TO_SKIP的判断逻辑错误,os.walk要跳过指定目录的正确做法是直接修改遍历过程中的dirnames列表,os.walk会自动跳过被移除的目录。
3. 完整可运行修改代码
import os FILE_TYPES_FILE = "file_types.txt" DIRECTORY_NAME = "directory_to_go_through" OUTPUT_FILE_NAME = "file_lengths.csv" OUTPUT_FILE_FOLDER = "folder.csv" TO_SKIP_FILE = "to_skip.txt" def get_file_length(filename): with open(filename, "rb") as file: data = file.readlines() return len(data) # 读取扩展名配置 with open(FILE_TYPES_FILE, "r", encoding="utf-8") as file: FILE_TYPES = [line.strip() for line in file if line.strip()] # 处理无扩展名匹配标记 MATCH_NO_EXT = "__NO_EXT__" in FILE_TYPES if MATCH_NO_EXT: FILE_TYPES.remove("__NO_EXT__") FILE_TYPES = tuple(FILE_TYPES) FILES_TO_SKIP = [] DIRS_TO_SKIP = [] with open(TO_SKIP_FILE, "r", encoding="utf-8") as file: to_skip = [line.strip() for line in file if line.strip()] for thing_to_skip in to_skip: if os.path.isfile(thing_to_skip): FILES_TO_SKIP.append(thing_to_skip) print(f"{thing_to_skip} added to files-to-skip") elif os.path.isdir(thing_to_skip): DIRS_TO_SKIP.append(thing_to_skip) print(f"{thing_to_skip} added to directories-to-skip") else: continue list_of_files = [] excel_string = "" for(dirpath, dirnames, filenames) in os.walk(DIRECTORY_NAME): # 目录排除:修改dirnames列表让os.walk自动跳过排除目录 dirnames[:] = [d for d in dirnames if os.path.join(dirpath, d) not in DIRS_TO_SKIP] # 筛选符合要求的文件 for file in filenames: full_path = os.path.join(dirpath, file) if full_path in FILES_TO_SKIP: continue ext = os.path.splitext(file)[1] if ext in FILE_TYPES or (ext == "" and MATCH_NO_EXT): list_of_files.append(full_path) excel_string += dirpath + "\n" with open(OUTPUT_FILE_FOLDER, "w", encoding="utf-8") as file: file.write(excel_string) input("Press enter to exit...") excel_string = "" for file in list_of_files: excel_string += f"{file};{get_file_length(file)}\n" print(excel_string) with open(OUTPUT_FILE_NAME, "w", encoding="utf-8") as file: file.write(excel_string) print(excel_string) input("Press enter to exit...")
使用说明
需要匹配无扩展名文件时,直接在file_types.txt里加一行__NO_EXT__即可,配置文件示例:
.cpp .c .h .bat __NO_EXT__
输出的CSV格式完全符合路径;行数的要求。
内容的提问来源于stack exchange,提问作者Twantie
相关产品推荐
相关产品推荐

