2013-11-14 5 views
0

Мне нужно переименовать мою картинку с данными EXIF, но у меня есть проблема: если я использую «:», чтобы отделить время (час: минута: секунда), имя файла становится сумасшедшим!неправильное переименование с python

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 
+0

Я предполагаю, что вы на Windows, правильно? – abarnert

+0

двоеточие не разрешено в именах файлов во многих системах, поэтому, возможно, вместо этого попробуйте подчеркнуть? – beroe

+0

@beroe: На самом деле, большинство систем позволяют им; это в основном просто Windows (и классический Mac, но никто больше этого не использует); OS X, Linux и т. Д. – abarnert

ответ

1

Колоны зарезервированы символы в Windows, файловая система (см How would I go about creating a filename with invalid characters such as :?>?), поэтому название было заменено на авто -генерированный вместо.

Чтобы быть ясным, это не проблема Python. Не используйте двоеточия или другие зарезервированные символы в именах файлов, если вы не хотите, чтобы это произошло.

+0

Я не использую окна, я нахожусь на UBUNTU – user1835905

+0

@ user1835905: там же проблема, в зависимости от файловой системы. –

2

Проблема в том, что вам не разрешено вводить двоеточия в имена файлов в Windows. Вы на самом деле не используете Windows ... но вы :, используя общий ресурс SMB, что означает, что вы связаны правилами Windows.

Исправление состоит в том, чтобы не помещать двоеточия в ваши имена файлов.

Если вы хотите понять, почему происходит этот странный материал, читайте дальше.


Сведения о именах файлов Windows, описаны в Naming Files, Paths, and Namespaces на MSDN, но я буду суммировать соответствующие части здесь.

Ядро NT под Windows не имеет проблем с двоеточиями, но поверх слоя Win32 он не может их обрабатывать (а уровень квази-POSIX в MSVCRT находится поверх Win32).

Итак, на уровне C, если вы вызываете функции NT, такие как NtSetInformationFile, это сэкономит их просто отлично. Если вы вызываете функции Win32, такие как MoveFileEx, они обычно выдают вам ошибку, но если вы используете специальный синтаксис \\?\, чтобы сказать «передать это имя прямо в NT», он будет работать. И если вы вызываете функции MSVCRT, такие как rename, вы получите сообщение об ошибке. Старые версии Python называются rename, что просто даст вам ошибку. В более новых версиях вызывается MoveFileEx и будет пытаться обернуть это имя в \\?\ синтаксисе (потому что это также позволяет обойти некоторые другие глупые ограничения, такие как чрезмерно короткое значение MAX_PATH).

Итак, что произойдет, если вы дадите файлу имя, которое Win32 не может понять? Помните, что в Windows каждый файл имеет два разных имени: «long name» и «short name». Сокращенное имя - это имя файла в формате DOS 8.3. Поэтому, когда он не может отображать длинное имя, вместо него отображается короткое имя.

Откуда короткое имя? Если вы не создадите его явно, Windows создаст его для вас из длинного имени, используя первые 6 символов, тильду и несколько букв. Так, например, краткое имя для "Program Files" - "PROGRA~1". Но если Windows не может обрабатывать длинное имя, оно просто составит короткое имя из 6 случайных символов, тильды и случайного символа. Таким образом, вы получаете что-то вроде 2A443K~H.

Файловая система NTFS, предназначенная для Windows, ожидается, что она будет использоваться в Windows-y способами.Таким образом, если вы используете том NTFS, даже в системе, отличной от Windows, драйвер будет эмулировать некоторые из этих функций, что даст вам аналогичное, но не тождественное поведение.

И, конечно, если вы разговариваете с долей из системы Windows или совместно с диском NTFS в системе, отличной от Windows, снова будут применяться некоторые из тех же вещей.

Даже если ваш компьютер и файловый сервер не являются Windows, а файловая система не является NTFS, если вы используете SMB/CIFS для совместного использования файлов, SMB также был разработан для Windows, и вы снова получите аналогичное поведение ,

По крайней мере, вам больше не придется беспокоиться о VMS, классическом Mac и других системах именования, просто POSIX и Windows.

+0

Я не использую окна, я нахожусь на UBUNTU – user1835905

+0

@ user1835905: Является ли файл на диске NTFS или SMB? Если это так, то, что вы видите, вероятно, является драйвером, имитирующим сумасшедшее поведение Windows. – abarnert

+0

удар! Я проверил: на моем разделе ext4 хорошо работает, я получаю сообщение об ошибке на SMB-ресурсе ... – user1835905

Смежные вопросы