查看: 101|回复: 3

Python使用相对路径读取文件避免跨平台运行错误

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
Python 编写的脚本常需要读取本地的数据文件,但直接使用绝对路径会导致程序在别的电脑或操作系统上无法运行。跨平台兼容的关键在于使用相对路径,将数据文件与程序文件放在同一目录下,并通过 Python 内置的 os 和 sys 模块动态获取当前脚本所在的文件夹路径。

首先导入所需模块:
  1. import os
  2. import sys
复制代码

然后通过 sys.argv[0] 获取当前脚本的完整路径(包括文件名),再使用 os.path.dirname 提取目录部分,最后用 os.path.abspath 将其转换为绝对路径,避免因相对引用导致路径错误。
  1. path = os.path.abspath(os.path.dirname(sys.argv[0]))
复制代码

此时 path 就是程序文件所在的文件夹路径,也是数据文件存放的目录。之后使用 pandas 读取文件时,只需拼接文件名即可:
  1. x = pd.read_csv(path + '/文件名')
复制代码

注意:如果使用 Windows 系统,路径分隔符也可以改用 os.path.join 自动适配,如:
  1. x = pd.read_csv(os.path.join(path, '文件名'))
复制代码

这种方法保证别人拿到你的代码和数据文件夹后,无需修改任何路径就能直接运行,实现了真正的跨平台交付。

总结:通过 sys.argv[0] 获取脚本自身位置,结合 os.path.dirname 和 os.path.abspath 得到稳定目录,再拼接文件名,是 Python 处理相对路径读取文件的标准做法,适用于开发、测试和生产环境的数据文件读取场景。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python使用相对路径读取文件避免跨平台运行错误

楼主分享的方法很实用,确实能解决跨平台路径兼容问题。另外补充一点:Python 3.4 之后可以用 `pathlib` 模块,写起来更简洁,比如 `Path(__file__).parent / '文件名'`,也能自动适配系统分隔符。不过你提到的 `sys.argv[0]` 在打包成 exe 时可能失效,那时可以用 `__file__` 或者 `sys.executable` 替代,但日常脚本开发中你的做法完全够用。感谢分享!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python使用相对路径读取文件避免跨平台运行错误

感谢楼主的详细分享!确实,用 `os.path.dirname(sys.argv[0])` 配合 `os.path.abspath` 是跨平台很稳的做法,团队协作或交付给别人时能省掉很多“路径不存在”的报错。我自己习惯配合 `pathlib` 用 `Path(__file__).parent`,但正如你所说,`__file__` 在某些打包环境里会失效,这时候 `sys.argv[0]` 就更可靠。楼主提到的 `os.path.join` 自动适配分隔符也是个好提醒,Windows 和 Linux 之间切换不用再手动改斜杠了。感谢分享!
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python使用相对路径读取文件避免跨平台运行错误

感谢楼主分享这个实用的跨平台路径处理方法。用 `sys.argv[0]` 加 `os.path.dirname` 和 `os.path.abspath` 确实能稳定获取脚本目录,配合 `os.path.join` 拼接路径,在不同系统下都能正确读取文件。我之前也遇到过绝对路径导致别人跑不了代码的问题,后来改用楼主说的这套方案就彻底解决了。另外补充一点:如果脚本被打包成 exe 或者通过其他方式启动,`sys.argv[0]` 有时会返回奇怪的内容,这时可以用 `__file__` 来替代,道理是一样的。总之这个方法非常实用,推荐给所有写 Python 脚本的朋友。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-17 20:55 , Processed in 0.024681 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部