python - 用python重命名错误

标签 python ubuntu rename exif

我需要用 EXIF 数据重命名我的图片,但是我有一个问题:如果我使用“:”来分隔时间(小时:分钟:秒),文件名会变得疯狂!

metadata = pyexiv2.ImageMetadata(lunga + i)
metadata.read()
tag = metadata['Exif.Image.DateTime']
estensione = ".jpg"
new_data = tag.value.strftime('%Y-%m-%d %H-%M-%S')
new_name = lunga + str(new_data) + estensione
os.renames(lunga + i, new_name)     

效果很好,但有
    new_data = tag.value.strftime('%Y-%m-%d %H:%M:%S')

我得到类似的东西
2A443K~H.jpg

最佳答案

问题是您不允许在 Windows 上将冒号放入文件名中。您实际上并未使用 Windows……但您使用的是 SMB 共享,这意味着您受 Windows 规则的约束。

解决方法是不要将冒号放入文件名中。

如果您想了解为什么会发生这种奇怪的事情,请继续阅读。

Naming Files, Paths, and Namespaces 中描述了 Windows 文件名的详细信息。在 MSDN,但我会在这里总结相关部分。

Windows 下的 NT 内核对冒号没有问题,但它上面的 Win32 层无法处理它们(MSVCRT 中的 quasi-POSIX 层位于 Win32 之上)。

因此,在 C 级别,如果您调用 NT 函数,如 NtSetInformationFile ,它会很好地保存它们。如果你调用 Win32 函数如 MoveFileEx ,他们通常会给你一个错误,但如果你使用特殊的 \\?\语法说“将此名称直接传递给 NT”,它将起作用。如果您调用 MSVCRT 函数,例如 rename ,你会得到一个错误。旧版本的 Python 称为 rename ,这只会给你一个错误。较新版本请调用 MoveFileEx , 并将尝试将名称包含在 \\?\ 中语法(因为这也允许您绕过一些其他愚蠢的限制,例如过短的 MAX_PATH 值)。

那么,如果你给一个文件取了一个 Win32 无法理解的名字会怎样呢?请记住,在 Windows 上,每个文件都有两个不同的名称:“长名称”和“短名称”。短名称是 DOS 风格的 8.3 文件名。因此,当它无法显示长名称时,它会显示短名称。

简称从何而来?如果您没有显式创建一个,Windows 将使用前 6 个字符、一个波浪号和一些字母从长名称中为您创建一个。例如,"Program Files" 的简称是 "PROGRA~1" .但如果 Windows 不能处理长名称,它只会用 6 个随机字符、一个波浪号和一个随机字符组成一个短名称。所以你会得到类似 2A443K~H .

为 Windows 设计的 NTFS 文件系统期望以 Windows-y 方式使用。因此,如果您使用的是 NTFS 卷,即使在非 Windows 系统上,驱动程序也会模拟其中的一些功能,为您提供类似但不相同的行为。

当然,如果您正在与来自 Windows 系统的共享或由非 Windows 系统上的 NTFS 驱动器支持的共享通信,同样,一些相同的事情将适用。

即使您的计算机和文件服务器都是非 Windows 并且文件系统不是 NTFS,如果您使用 SMB/CIFS 进行文件共享,SMB 也是为 Windows 设计的,您将再次获得类似的行为。

至少您不再需要担心 VMS、经典 Mac 和其他命名系统,只需 POSIX 和 Windows。

关于python - 用python重命名错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19990175/

相关文章:

python - 获取日期并将其另存为文件名python

mysql - 如何使用另一个虚拟机访问托管在虚拟机上的 MySQL 服务器?

根据模式重命名列表中命名向量的名称

python - wc -l 和 python 行数不同

python - 对 Pandas 中的分层数据进行子集化

python - 调整 crontab 作业时间

php - AWS SQS 使用接收句柄删除消息

新引用现有文件时linux api重命名行为

javascript - JavaScript 中输入 FileUpload 对象 : can’t change the name of the selected file

python - 如果我没有得到 float 作为输入,我该如何打印一些东西