【问题标题】:Saving to the Desktop folder on Windows保存到 Windows 上的桌面文件夹
【发布时间】:2016-06-15 10:54:01
【问题描述】:

我在将文件保存到 Windows 上的“桌面”文件夹时遇到问题。我有两个 try 声明。第一个尝试为 Mac 保存文件。第二个尝试将其保存为 Windows。第二个except 处理程序默认将文件保存在与应用程序相同的文件夹中。

try:
    wb = openpyxl.load_workbook(os.path.expanduser('~/Desktop/' + 
            dateCur + '_' + timeCur + '_bap_attendance.xlsx'))
except:
    try:
        wb = openpyxl.load_workbook(os.getenv('%HOMEPATH%') + '\\Desktop\\' + 
            dateCur + '_' + timeCur + '_bap_attendance.xlsx')
    except:
        wb = openpyxl.load_workbook(
            self.manager.get_screen('offline').ids.label3.text)

当我收到错误消息时,它通常表示它正在寻找Users\BobSmith,但 Windows 帐户实际上应该在用户名中有一个空格。 getpass.getuser() 也返回“BobSmith”,但我需要输入“Bob Smith”才能切换到目录并进入“Desktop”文件夹。

【问题讨论】:

  • 你打印os.path.expanduser('~/Desktop')的值了吗?要扩展初始的“~”,它会尝试os.environ['HOME']os.environ['USERPROFILE']join(os.environ['HOMEDRIVE'], os.environ['HOMEPATH'])。通常HOME 没有在 Windows 上定义,但USERPROFILE 应该是。
  • 谢谢!出于某种原因,它打印正确,但是当我运行程序时,它仍然说找不到路径并打印出没有用户帐户空格的路径,即“找不到 ...\BobSmith\”它是必需的。今晚我会尝试一些事情来看看这个问题到底发生在哪里,但我猜这是开放声明。我想我还记得看到一些关于该文件不是 openpyxl 的 zip 文件的信息。今晚晚些时候我回来后会发布更多内容。
  • “正确”是指打印C:\Users\Bob Smith\Desktop吗?同时打印os.environ['HOME']os.environ['USERPROFILE']os.path.join(os.environ['HOMEDRIVE'], os.environ['HOMEPATH'])
  • 我刚刚编写了一个快速程序,它使用 os.path.normcase(os.path.expanduser('~/Desktop/OSX/' + dateCur + '_' + timeCur + '_bap_attendance.xlsx')) 执行程序的相同任务。这行得通,现在我不需要为这两个系统编写两个替代路径。当添加到最终程序中时,它也可以工作。感谢您的帮助!

标签: python windows filepath


【解决方案1】:

如果找不到变量,os.getenv() 将返回 None。在我看来,检查getenv 是否不返回None 然后才执行try/except 块会更优雅。

更相关的问题似乎是您如何尝试检索%HOMEPATH%,尽管Windows 使用%sys_var% 作为系统变量,getenv() 需要它们而不需要% 符号。此外,HOMEPATH 返回路径但没有驱动器,HOME or USERPROFILE 将返回完整路径。

尝试以下修改后的代码,它应该也适用于 Windows。

try:
    wb = openpyxl.load_workbook(os.path.expanduser('~/Desktop/' + dateCur + '_' + timeCur + '_bap_attendance.xlsx'))
except:
    homepath = os.getenv('USERPROFILE')
    if homepath:
        try:
            wb = opennpyxl.load_workbook(homepath + '\\Desktop\\' + dateCur + '_' + timeCur + '_bap_attendance.xlsx')
        except:
            wb = openpyxl.load_workbook(self.manager.get_screen('offline').ids.label3.text)

此外,您可以使用sys.platform() 来执行特定于您的操作系统的代码。

【讨论】:

  • 感谢您的回复!哦,我不知道美元。在尝试了这个并使用 os.path.expanduser() 之后,问题似乎仍然存在,它试图找到 User\BobSmith 而不是 User\Bob Smith。我不完全喜欢 Windows 自动执行此操作,因为我觉得我的问题可以通过占用用户名的空间来暂时解决。我想我可以只创建一个未链接到 MS 帐户的本地帐户,但这只是一个非常临时的补丁,因为其他用户不一定想要这样做。稍后我会回来提供更多详细信息。
  • 刚刚创建了一个用户帐户Test User(带空格),os.getenv 返回一个正确的路径,例如for dir in os.walk(os.getenv('USERPROFILE') + '\\Desktop'): print(dir) ('C:\\Users\\Test User\\Desktop', [], ['desktop.ini', 'anotherfile''])
  • 我认为代码中的其他地方还有一个小错误。我刚刚编写了一个快速程序,它使用 os.path.normcase(os.path.expanduser('~/Desktop/OSX/' + dateCur + '_' + timeCur + '_bap_attendance.xlsx')) 执行程序的相同任务。这行得通,现在我不需要为这两个系统编写两个替代路径。当添加到最终程序中时,它也可以工作。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多