当我使用绝对路径而不是相对路径时,为什么 write() 不能正常工作?

Why is write() not working correctly when I am using absolute paths instead of relative ones?

我的 desktop.I 上有一个文件 Creep lyrics.rtf,我想使用 Python 将其转换为 zip 文件。我使用了两种方法,一种有效,一种无效。

方法 1(有效):

import zipfile,os

os.chdir('/Users/apple/desktop')

Toy=zipfile.ZipFile('lyrics.zip','w') #Toy is the variable name
Toy.write('Creep lyrics.rtf',compress_type=zipfile.ZIP_DEFLATED) #This specifies to use the deflate compression algorithm.

Toy.close()

方法 2(无效):

import zipfile


Toy=zipfile.ZipFile('lyrics.zip','w')
Toy.write('/users/apple/desktop/Creep lyrics.rtf',compress_type=zipfile.ZIP_DEFLATED)
Toy.close()

如您所见,我在第二种情况下使用了文件Creep lyrics.rtf的绝对路径,而在第一种情况下我使用了相对路径。

就像我到目前为止处理的大多数情况一样,使用相对路径还是绝对路径并不重要!那么我应该在尝试创建 zip 文件时始终使用相对路径还是我做错了什么?

这不是 absolute/relative 路径问题。 os.chdir('/Users/apple/desktop') 更改了您当前的工作目录。

在第二个中尝试使用

Toy=zipfile.ZipFile('/Users/apple/desktop/lyrics.zip','w')

可能无法在当前工作目录中创建文件。此外,在 OSx 中,如果分区被格式化为不区分大小写,则路径不区分大小写(通常是这种情况,但并非总是如此)。

让我们举一些例子:

区分大小写

您的系统只有一个分区,并且该分区的格式不区分大小写:比路径 /Users/apple/desktop/users/apple/desktop/users/APPLE/DESKtop(等等...)被文件系统认为是完全相等的。

现在假设你把你的软件给了一个朋友,他有一个只有一个分区的系统,并且这个分区被格式化为 sensitive: 比路径 /Users/apple/desktop/users/apple/desktop/users/APPLE/DESKtop(等等...)被文件系统认为是完全不同的。路径 /Users/apple/desktop/users/apple/desktop 在不同计算机之间不一致。

加分项:避免在路径中使用空格。 shell 将带有空格的路径理解为多个路径,除非它被引号包围,这很烦人。

当前工作目录

您使用 os.chdir('/Users/apple/desktop') 与在您的终端中发出 cd /Users/apple/desktop 相同(要知道 cd 是什么,请在您的终端中使用 运行 man cd ).

那一行更改了当前工作目录,或者处理了相对于所有相对路径的目录。您可以在终端中使用命令 pwd 了解您当前的工作目录。

我们举个例子。您正在 运行 将您的 python 脚本放在根目录 / 中,您的用户没有为其写入文件的权限。 Toy=zipfile.ZipFile('lyrics.zip','w') 尝试写入一个新文件 /lyrics.zip 但系统实际上不允许您 write/create 该文件。所以你有一些解决方案可以采用:

  1. 正在使用 os.chdir
  2. 更改您当前的工作目录
  3. 在您实际可以写入的绝对路径或相对路径中写入

等等等

可能由于区分大小写以及您没有将 dir 更改为 zip 文件的位置,所以它无法正常工作。

'/users/apple/desktop/Creep lyrics.rtf' 更改为 '/Users/apple/desktop/lyrics.zip/Creep lyrics.rtf' 可能会解决问题