V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mathzhaoliang
V2EX  ›  问与答

问一个 Python 搜索文件路径的问题

  •  
  •   mathzhaoliang · 2018-03-26 12:05:12 +08:00 · 1639 次点击
    这是一个创建于 2223 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 python 中打开一个文件的时候,默认是先在当前目录下找。我想把当前目录下的一个子目录也加入搜索路径,应该怎么做呢?

    比如说我在当前目录是这样的:

    • main.py

    • 岛国爱情片

      • 种子 1.txt
      • 种子 2.txt
      • ...

    我想在 main.py 中写 with open('种子 1.txt', 'r') 的时候,python 既搜索当前目录,也能搜索 "岛国爱情片" 这个目录,我感觉可以直接 sys.path.append("岛国爱情片"),但是不成功,这个应该怎么写呢?

    20 条回复    2018-03-26 13:41:50 +08:00
    BingoXuan
        1
    BingoXuan  
       2018-03-26 12:29:32 +08:00 via Android
    你 sys.append('岛国爱情片')写的是绝对路径还是相对路径?
    BingoXuan
        2
    BingoXuan  
       2018-03-26 12:29:56 +08:00 via Android
    @BingoXuan sys.path.append
    mathzhaoliang
        3
    mathzhaoliang  
    OP
       2018-03-26 12:36:53 +08:00
    @BingoXuan 相对路径,我写的 sys.append("./岛国爱情片 /")
    BingoXuan
        4
    BingoXuan  
       2018-03-26 12:52:08 +08:00 via Android
    @mathzhaoliang 我记得是不接受相对路径的,不妨试一下把路径打印出来看看。我建议设计路径统一写绝对路径,通过 main 的__file__来对子目录进行操作。可以试一下 sys.path.append(os.path.dirname(__file__) +'/岛国爱情片')增加路径。写得不优雅,你看看行不行。
    mathzhaoliang
        5
    mathzhaoliang  
    OP
       2018-03-26 12:54:28 +08:00
    @BingoXuan 谢谢你的热心回复!我也是这么写的,确实可以。
    BingoXuan
        6
    BingoXuan  
       2018-03-26 12:54:31 +08:00 via Android
    @BingoXuan
    又漏了,要加上 os.path.abspath 方法判断绝对路径,然后用 os.path.dirname 方法获取所在文件夹路径,填上子目录就好了
    mathzhaoliang
        7
    mathzhaoliang  
    OP
       2018-03-26 12:56:22 +08:00
    @BingoXuan 不对,刚才看错了,这样还是不行
    mathzhaoliang
        8
    mathzhaoliang  
    OP
       2018-03-26 12:56:55 +08:00
    @BingoXuan 求详解
    BingoXuan
        9
    BingoXuan  
       2018-03-26 12:57:37 +08:00 via Android
    @mathzhaoliang
    现在接手的项目一堆路径坑,同事用 IDE 写的路径自动配置是没问题,问题一到生产环境就报路径错误,每次都要我改,改习惯了
    mathzhaoliang
        10
    mathzhaoliang  
    OP
       2018-03-26 13:00:02 +08:00
    @BingoXuan 还没明白,为什么要 abspath 判断绝对路径呢?
    scola
        11
    scola  
       2018-03-26 13:01:33 +08:00
    我之前写的, 把一个目录下包含子目录的所有 java 代码, 放到一个 txt 里面保存
    你可以参考一下

    https://gist.github.com/scola/6cb68ef9d0645c332a43f5ee14e02529
    BingoXuan
        12
    BingoXuan  
       2018-03-26 13:02:38 +08:00 via Android
    @mathzhaoliang
    把 sys.path 打印出来后,看看岛国爱情片的路径是不是有效的绝对路径。你加上 os.path.abspath 获取绝对路径了吗?
    BingoXuan
        13
    BingoXuan  
       2018-03-26 13:05:20 +08:00 via Android
    @mathzhaoliang
    因为 Python 内部一般用相对路径,但系统调用是绝对路径,所以增加路径时候一定要走绝对路径,不然系统并不知道真实路径
    mathzhaoliang
        14
    mathzhaoliang  
    OP
       2018-03-26 13:07:58 +08:00
    @BingoXuan 打印出来以后显示子目录在 sys.path 里面,但是还是打不开。
    mathzhaoliang
        15
    mathzhaoliang  
    OP
       2018-03-26 13:13:57 +08:00
    @BingoXuan

    这样对否?

    path = os.path.abspath(__file__)
    path = os.path.dirname(path)
    sys.path.append(path + '/岛国爱情片 /')
    print(sys.path)
    BingoXuan
        16
    BingoXuan  
       2018-03-26 13:17:27 +08:00 via Android
    @mathzhaoliang 这两天病了状态不好,也许我理解错了。我一开始理解是岛国爱情片里面的 py 模块,如果你是打开普通文件的话,使用 os.listdir 搜索对应文件,找到其绝对路径,再进行操作。
    weeevv
        17
    weeevv  
       2018-03-26 13:21:31 +08:00 via Android
    glob 加 正则表达式?
    mathzhaoliang
        18
    mathzhaoliang  
    OP
       2018-03-26 13:22:26 +08:00
    @BingoXuan 我不是要搜索单个文件,而是要把整个子目录里面的普通文件加入搜索路径,这样写 open(f, "r") 的时候只写 f 的文件名就行,不用再写路径。
    BingoXuan
        19
    BingoXuan  
       2018-03-26 13:36:45 +08:00 via Android
    那就只可以通过一个函数遍历 sys.path 里面所有路径是否存在某一名字的文件了,sys.path 只负责 py 文件搜索不负责普通文件
    mathzhaoliang
        20
    mathzhaoliang  
    OP
       2018-03-26 13:41:50 +08:00
    @BingoXuan 明白了,谢谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3350 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 140ms · UTC 10:42 · PVG 18:42 · LAX 03:42 · JFK 06:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.