django学习——os.path与sys.path

本文解释了Django项目中setting.py文件内的路径配置方法,包括如何利用os.path获取项目根目录(BASE_DIR),以及如何通过sys.path添加自定义模块路径。

django中的setting.py文件中有一些路径的问题,主要为os.path与sys.path.

1、os.path

os.path.abspath(__file__)为获取当前文件的绝对路径
os.path.dirname()为获取当前路径上一级的路径

所以:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

意思就是获取当前文件(setting.py)上一级的上一级的绝对路径为根路径BASE_DIR.

这里写图片描述

如上图,加黑的mxonline3下面的路径就是根路径BASE_DIR。

os.path.join(path1[, path2[, ...]]) 将多个路径组合在一起,第一个绝对路径之前的参数将被忽略。

os.path.join(BASE_DIR, 'apps')

即为将根目录下的apps添加到根目录下,这样可以直接搜索apps下的文件内容。

2、sys.path

sys.path是python的搜索模块的路径集,是一个list.

可以在python 环境下使用:
sys.path.append(‘你的模块的名称’)。

sys.path.insert(0,’模块的名称’)

添加相关的路径,但在退出python环境后自己添加的路径就会自动消失!

sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))

这样可以直接import apps 下面的app

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 文件格式转换工具 v1.3 功能:递归遍历目录,将所有的.c/.h文件转换为文本格式(.txt) """ import os import sys import chardet import argparse def detect_file_encoding(file_path): """自动检测文件编码[^1]""" with open(file_path, 'rb') as f: raw_data = f.read(4096) # 读取前4KB内容进行检测 result = chardet.detect(raw_data) return result['encoding'] or 'utf-8' def convert_file(src_path, dest_root): """ 转换单个文件并保存为文本格式 :param src_path: 源文件路径 :param dest_root: 目标根目录 :return: 转换后的文件路径 """ # 获取源文件相对于起始目录的相对路径 rel_path = os.path.relpath(src_path, start=os.path.dirname(src_path)) # 构建目标路径(保持原始目录结构) dest_dir = os.path.join(dest_root, os.path.dirname(rel_path)) os.makedirs(dest_dir, exist_ok=True) # 构建目标文件名(替换扩展名为.txt) base_name = os.path.basename(src_path) dest_path = os.path.join(dest_dir, f"{os.path.splitext(base_name)[0]}.txt") # 检测并读取源文件 try: encoding = detect_file_encoding(src_path) with open(src_path, 'r', encoding=encoding) as src_file: content = src_file.read() except (UnicodeDecodeError, LookupError): # 回退到latin-1编码(覆盖所有字节) with open(src_path, 'r', encoding='latin-1') as src_file: content = src_file.read() encoding = 'latin-1' # 添加元数据头(保留原始文件信息) metadata = f"""// ============================================== // 原始文件: {base_name} // 源路径: {os.path.abspath(src_path)} // 检测编码: {encoding.upper()} // 转换时间: {os.path.getmtime(src_path):.0f} // ============================================== """ # 写入目标文件 with open(dest_path, 'w', encoding='utf-8') as dest_file: dest_file.write(metadata + content) return dest_path def process_directory(source_dir, target_dir): """处理目录中的所有.c/.h文件""" processed_count = 0 error_files = [] for root, _, files in os.walk(source_dir): for file in files: if file.lower().endswith(('.c', '.h')): src_path = os.path.join(root, file) try: dest_path = convert_file(src_path, target_dir) print(f"✓ 转换成功: {src_path} → {dest_path}") processed_count += 1 except Exception as e: error_detail = f"{file}: {str(e)}" error_files.append(error_detail) print(f"✗ 转换失败: {error_detail}") # 输出摘要报告 print("\n" + "=" * 50) print(f"转换完成!") print(f"源目录: {os.path.abspath(source_dir)}") print(f"目标目录: {os.path.abspath(target_dir)}") print(f"处理文件数: {processed_count}") if error_files: print(f"失败文件数: {len(error_files)}") for error in error_files[:3]: # 最多显示3个错误 print(f" - {error}") if len(error_files) > 3: print(f" ...及其他{len(error_files) - 3}个错误") return processed_count if __name__ == "__main__": parser = argparse.ArgumentParser(description='C/C++源文件转换工具') parser.add_argument('source', help='源目录路径') parser.add_argument('target', help='目标目录路径') args = parser.parse_args() if not os.path.exists(args.source): print(f"错误: 源目录不存在 - {args.source}") sys.exit(1) if not os.path.exists(args.target): os.makedirs(args.target, exist_ok=True) total_files = process_directory(args.source, args.target) print("=" * 50) 以上是我的代码,现在报错 usage: change_txt.py [-h] source target change_txt.py: error: the following arguments are required: source, target
最新发布
08-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值