python重命名错误

python重命名错误,python,ubuntu,rename,exif,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(

我需要用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文件系统中的保留字符(请参阅),因此该名称被替换为自动生成的on


要明确的是,这不是Python的问题。如果不希望发生这种情况,请不要在文件名中使用冒号或其他保留字符。

冒号是Windows文件系统中的保留字符(请参阅),因此该名称已替换为自动生成的


要明确的是,这不是Python的问题。如果不希望发生这种情况,请不要在文件名中使用冒号或其他保留字符。

冒号是Windows文件系统中的保留字符(请参阅),因此该名称已替换为自动生成的


要明确的是,这不是Python的问题。如果不希望发生这种情况,请不要在文件名中使用冒号或其他保留字符。

冒号是Windows文件系统中的保留字符(请参阅),因此该名称已替换为自动生成的


要明确的是,这不是Python的问题。如果不希望出现这种情况,请不要在文件名中使用冒号或其他保留字符。

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

解决方法是不要在文件名中使用冒号

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


有关Windows文件名的详细信息在MSDN中有描述,但我将在这里总结相关部分

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

因此,在C级,如果调用NT函数,比如,它将很好地保存它们。如果像这样调用Win32函数,它们通常会给您一个错误,但是如果您使用特殊的
\\?\
语法说“将此名称直接传递到NT”,它将起作用。如果调用MSVCRT函数,如
重命名
,则会出现错误。Python的旧版本称为
重命名
,这只会给您一个错误。较新的版本调用
MoveFileEx
,并尝试用
\\?\
语法将名称包装起来(因为这还允许您绕过一些其他愚蠢的限制,例如过短的
MAX\u路径
值)

那么,如果您给一个Win32无法理解的文件命名,会发生什么情况?请记住,在Windows上,每个文件都有两个不同的名称:“长名称”和“短名称”。短名称是DOS样式的8.3文件名。因此,每当它不能显示长名称时,就会显示短名称

这个短名字来自哪里?如果不显式创建一个,Windows将使用前6个字符、一个波浪号和一些字母从长名称中为您创建一个。例如,
“程序文件”
的简称是
“PROGRA~1”
。但是,如果Windows不能处理长名称,它只会用6个随机字符、一个波浪号和一个随机字符组成一个短名称。所以你得到了类似于
2A443K~H
的东西

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

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

即使您的计算机和文件服务器都不是Windows,文件系统也不是NTFS,如果您使用SMB/CIFS进行文件共享,SMB也是为Windows设计的,您也会再次遇到类似的行为


至少你不必再担心VM、经典Mac和其他命名系统,只需担心POSIX和Windows。

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

解决方法是不要在文件名中使用冒号

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


有关Windows文件名的详细信息在MSDN中有描述,但我将在这里总结相关部分

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

因此,在C级,如果调用NT函数,比如,它将很好地保存它们。如果像这样调用Win32函数,它们通常会给您一个错误,但是如果您使用特殊的
\\?\
语法说“将此名称直接传递到NT”,它将起作用。如果调用MSVCRT函数,如
重命名
,则会出现错误。Python的旧版本称为
重命名
,这只会给您一个错误。较新的版本调用
MoveFileEx
,并尝试用
\\?\
语法将名称包装起来(因为这还允许您绕过一些其他愚蠢的限制,例如过短的
MAX\u路径
值)

那么,如果您给一个Win32无法理解的文件命名,会发生什么情况?请记住,在Windows上,每个文件都有两个不同的名称:“长名称”和“短名称”。短名称是DOS样式的8.3文件名。因此,每当它不能显示长名称时,就会显示短名称

这个短名字来自哪里?如果不显式创建一个,Windows将使用前6个字符、一个波浪号和一些字母从长名称中为您创建一个。那么,f