touch
утилита Unix, которая устанавливает время модификации и доступа к файлам в соответствии с текущим временем дня Если файл не существует, он создается с разрешениями по умолчанию.
Как бы вы реализовали это как функцию Python? Постарайтесь быть кроссплатформенным и завершенным.
(Текущие результаты Google для "python touch file" не так уж хороши , но указывают на os.utime .)
touch
функциональности, подобной их программам на Python, а не как заново реализовать ее с нуля; этих людей лучше всего обслуживать, прокручивая доpathlib
решения. Несмотря на то, что он теперь встроен, этот ответ имеет гораздо лучший рейтинг в Google для «файла касания Python», чем в соответствующей документации .Ответы:
Похоже, что это новый с Python 3.4 -
pathlib
.Это создаст
file.txt
на пути.-
источник
pip install pathlib
Path('/some/path').mkdir()
если каталог, содержащий файл дляtouch()
редактирования, еще не существует.pathlib2
вместо,pathlib
потому чтоpathlib
сейчас исправлена только ошибка. Поэтому на Python 2.7:pip install pathlib2
а потомfrom pathlib2 import Path
.Это пытается быть немного более свободным от гонок, чем другие решения. (
with
Ключевое слово является новым в Python 2.5.)Примерно эквивалентно этому.
Теперь, чтобы действительно сделать его свободным от гонки, вам нужно использовать
futimes
и изменять временную метку открытого дескриптора файла, вместо того, чтобы открывать файл и затем изменять временную метку в имени файла (которое могло быть переименовано). К сожалению, Python, кажется, не предоставляет способ звонить,futimes
не проходяctypes
или аналогичные ...РЕДАКТИРОВАТЬ
Как отметил Нейт Парсонс , Python 3.3 добавит указание файлового дескриптора (когда
os.supports_fd
) для таких функций, какos.utime
, который будет использоватьfutimes
системный вызов вместоutimes
системного вызова под капотом. Другими словами:источник
file
функция была удалена из Python 3 иopen
должна использоваться вместо нее. Я полностью пропустил это, потому что подсветка синтаксиса редактора, который я использую (gedit), все еще нацелена на Python 2.источник
open()
вызова, содержимое файла будет усечено. Предложите'a'
вместо этого использовать режим .open(fname, 'a').close()
никогда не изменится.os.utime()
для уже существующих файлов.Почему бы не попробовать это?
Я считаю, что это устраняет любые расы, которые имеют значение. Если файл не существует, то будет выдано исключение.
Единственное возможное условие состязания здесь - это если файл создается до вызова open (), но после os.utime (). Но это не имеет значения, потому что в этом случае время модификации будет таким, как ожидалось, так как оно должно было произойти во время вызова touch ().
источник
Вот некоторый код, который использует ctypes (тестируется только в Linux):
источник
Этот ответ совместим со всеми версиями начиная с Python-2.5, когда
with
было выпущено ключевое слово .1. Создать файл, если он не существует + Установить текущее время
(точно так же, как команда
touch
)Более надежная версия:
2. Просто создайте файл, если он не существует
(не обновляет время)
3. Просто обновите доступ к файлу / измените время
(не создает файл, если он не существует)
Использование
os.path.exists()
не упрощает код:Бонус: время обновления всех файлов в каталоге
источник
источник
with open(fn,'a'): pass
или альтернативный вариант:open(fn, 'a').close()
не изменяйте измененное время, используя Python 2.7.5 в Red Hat 7 (файловая система - XFS). На моей платформе эти решения просто создают пустой файл, если он не существует. : - /Упрощенные:
open
гарантирует , что файл существуетutime
гарантирует , что временные метки обновляютсяТеоретически, возможно, что кто-то удалит файл после
open
, в результате чего utime вызовет исключение. Но, возможно, это нормально, поскольку случилось что-то плохое.источник
Сложный (возможно глючный):
Это также позволяет установить время доступа или изменения, как GNU touch.
источник
Может показаться логичным создать строку с нужными переменными и передать ее в os.system:
Это неадекватно во многих отношениях (например, оно не обрабатывает пробелы), поэтому не делайте этого.
Более надежный метод - использовать подпроцесс:
subprocess.call(['touch', os.path.join(dirname, fileName)])
Хотя это гораздо лучше, чем использовать подоболочку (с os.system), она по-прежнему подходит только для быстрых и грязных скриптов; используйте принятый ответ для кроссплатформенных программ.
источник
subprocess.call(['touch', os.path.join(dirname, fileName)])
это гораздо лучше, чем использовать подоболочку (сos.system
). Но все же, используйте это только для быстрых и грязных скриптов, используйте принятый ответ для кроссплатформенных программ.touch
не является кроссплатформенной доступной командой (например, Windows)"open (file_name, 'a'). close ()" не работал для меня в Python 2.7 в Windows. "os.utime (file_name, None)" работал просто отлично.
Кроме того, мне нужно было рекурсивно коснуться всех файлов в каталоге с датой старше некоторой даты. Я создал следующее на основе очень полезного ответа ephemient.
источник
Почему бы вам не попробовать: newfile.py
или
источник
Следующего достаточно:
Если вы хотите установить определенное время для касания, используйте os.utime следующим образом:
Здесь atime и mtime оба должны быть int / float и должны быть равны времени эпохи в секундах времени, которое вы хотите установить.
источник
Если вы не возражаете, попробуйте - кроме как ...
Однако следует отметить, что если файл существует с таким же именем, он не будет работать и будет молча работать.
источник
write_text()
изpathlib.Path
можно использовать.источник