【问题标题】:Reading a file in home directory from another directory从另一个目录读取主目录中的文件
【发布时间】:2014-11-08 00:25:00
【问题描述】:

我正在尝试读取另一个目录中的文件。我当前的脚本在path/to/dir。但是,我想读取~/ 中的文件。我不知道该怎么做。

我尝试了f = open("~/.file"),但出现错误

IOError: [Errno 2] No such file or directory: '~/.file'

【问题讨论】:

  • 完全展开~。在 *NIX 系统上,~ 是您的主目录的简写
  • 根据文档,它也适用于 Windows。
  • @PadraicCunningham:只有当您的名字恰好是 username 并且您恰好在某些特定的 linux 发行版上时才有效。
  • @PadraicCunningham:你假设 OP 想要硬编码一个路径,这样程序就永远不会为任何其他用户或任何其他机器运行?
  • @abarnert,是的,这正是我的想法,你是个读心者

标签: python


【解决方案1】:

使用os.path.expanduser:

import os
with open(os.path.expanduser('~/.file')) as f:
    print f.read()

【讨论】:

    【解决方案2】:

    这应该可以工作

    from os.path import expanduser
    home = expanduser("~")
    

    【讨论】:

    • 没有理由只扩展~ 本身。然后,您必须将 os.path.join 发送到路径的其余部分。首先更容易扩展~/.file,如 m.wasowski 的回答。
    【解决方案3】:

    os.path.expanduser 会帮助你

    【讨论】:

      【解决方案4】:

      简短的回答是:使用os.path.expanduser,作为m.wasowski shows

      f = open(os.path.expanduser("~/.file"))
      

      但是你为什么要这样做呢?

      嗯,~/.file 实际上并不意味着您认为它的含义。它只是在当前工作目录中名为 ~ 的子目录中请求名为 .file 的文件。

      为什么这在命令行上有效?因为 shell 不只是将您的参数按类型传递,它们还会进行各种复杂的处理。

      这就是为什么./myscript.py *txt 在您的argv 中提供['./myscript.py', 'a.txt', 'b.txt', 'c.txt', 'd e f.txt'] 的原因——因为shell 通过在目录中查找与该模式匹配的所有内容并将其转换为a.txt b.txt c.txt "d e f.txt" 来对*.txt 进行全局扩展。

      以同样的方式,它通过查看适当的环境变量和特定于平台的默认值等将~/.file 扩展为/Users/me/.file。您可以阅读bash 的血腥细节; dashtcsh 和大多数其他 shell(Windows cmdPowerShell 除外)的情况类似。

      Python 直接与文件系统对话,它不通过 shell 来完成。所以,如果你想做与 shell 相同的事情,你必须明确地做:glob.globos.path.expanduseros.path.expandvarssubprocess.check_output,等等。

      在 Python 中完成这一切很酷的事情是它在任何地方都以相同的方式工作。即使在 Windows 上,shell 不知道 ~/.file 的含义,而正确的答案可能是一些可怕的东西,例如 'C:\\Documents and Settings\\me\\Documents''\\\\FileServer\\RoamingProfiles\\me'os.path.expanduser 会给你正确的可怕的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多