0

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
4

2 に答える 2

2

問題は、Windows ではファイル名にコロンを使用できないことです。実際に Windows を使用しているわけではありませんが SMB 共有を使用しているため、Windows のルールに拘束されています。

修正は、ファイル名にコロンを入れないことです。

この奇妙なことが起こっている理由を理解したい場合は、読み進めてください。


Windows ファイル名の詳細については、MSDN の「ファイル、パス、および名前空間の命名」に記載されていますが、関連する部分をここで要約します。

Windows の下にある NT カーネルにはコロンの問題はありませんが、その上にある Win32 レイヤーはそれらを処理できません (そして、MSVCRT の準 POSIX レイヤーは Win32 の上にあります)。

したがって、C レベルでは、 のような NT 関数を呼び出すとNtSetInformationFile、問題なく保存されます。のような Win32 関数を呼び出すMoveFileExと、通常はエラーになりますが、\\?\「この名前をそのまま NT に渡す」という特殊な構文を使用すると、機能します。のような MSVCRT 関数を呼び出すとrename、エラーが発生します。と呼ばれる古いバージョンの Python ではrename、エラーが発生するだけでした。新しいバージョンは を呼び出しMoveFileEx、名前を構文にまとめようとします (これにより、極端に短い値\\?\など、他のいくつかのばかげた制限を回避できるため)。MAX_PATH

では、Win32 が理解できない名前をファイルに付けたらどうなるでしょうか。Windows では、すべてのファイルに「長い名前」と「短い名前」という 2 つの異なる名前があることに注意してください。短い名前は、DOS スタイルの 8.3 ファイル名です。そのため、長い名前を表示できない場合は常に、代わりに短い名前を表示します。

略称の由来は?明示的に作成しない場合、Windows は、最初の 6 文字、チルダ、および文字数を使用して、長い名前から作成します。したがって、たとえば、の短縮名は"Program Files"です"PROGRA~1"。しかし、Windows が長い名前を処理できない場合、6 つのランダムな文字、チルダ、およびランダムな文字から短い名前を作成します。したがって、次のようなものが得られます2A443K~H

Windows 用に設計された NTFS ファイルシステムは、Windows のような方法で使用されることを期待しています。そのため、Windows 以外のシステムでも NTFS ボリュームを使用している場合、ドライバーはこの機能の一部をエミュレートし、同様の動作を提供しますが、同一ではありません。

もちろん、Windows システムの共有、または Windows 以外のシステムの NTFS ドライブにバックアップされた共有と話している場合も、同じことがいくつか当てはまります。

コンピューターとファイル サーバーの両方が非 Windows であり、ファイル システムが NTFS ではない場合でも、ファイル共有に SMB/CIFS を使用している場合、SMB も Windows 用に設計されているため、同様の動作が発生します。

少なくとも、VMS、従来の Mac、およびその他の命名システムについて心配する必要はなくなり、POSIX と Windows だけになります。

于 2013-11-14T23:03:39.380 に答える
1

コロンは Windows ファイルシステムの予約文字です ( How would I go about creating a filename with invalid characters such as :?>? を参照)。そのため、代わりに名前が自動生成された on に置き換えられました。

明確にするために、これはPython の問題ではありません。これが発生したくない場合は、ファイル名にコロンやその他の予約文字を使用しないでください。

于 2013-11-14T23:03:07.290 に答える