2012-09-29 2 views
166

Я хотел бы создать файл с пустым x с помощью python. Я использовал os.system(y) где y = 'touch %s' % (x). Я искал версию без каталогов os.mkdir, но я ничего не смог найти. Есть ли такой инструмент для создания файла без его открытия или с использованием системного или всплывающего/подпроцесса?Создать пустой файл с помощью python

+2

Почему открытие плохое? –

+0

@LevLevitsky, потому что мне придется закрыть его снова: P. Мне нужно создать тысячи файлов, и прикосновение к файлу кажется более чистым. – tkbx

+1

FYI, при использовании внешней команды для этого всегда плохо, правильным способом выполнить его будет 'subprocess.call (['touch', x])' – ThiefMaster

ответ

302

Там нет никакого способа, чтобы создать файл, не открывая его Существует os.mknod("newfile.txt") (но это требует привилегий суперпользователя на OSX). Системный вызов для создания файла на самом деле open() с флагом O_CREAT. Поэтому независимо от того, вы всегда будете открывать файл.

Так самый простой способ, чтобы просто создать файл без усечения его в случае, если она существует такой:

open(x, 'a').close() 

На самом деле вы можете опустить .close() поскольку refcounting ГХ CPython закроются сразу после open() заявления завершено - но это чище сделать это явно, и полагаться на поведение, специфичное для CPython, тоже не очень хорошо.

В случае, если вы хотите поведение touch «s (т.е. обновить время изменения в случае существует файл):

import os 
def touch(path): 
    with open(path, 'a'): 
     os.utime(path, None) 

Вы можете расширить это также создавать каталоги в пути, которые не существуют:

basedir = os.path.dirname(path) 
if not os.path.exists(basedir): 
    os.makedirs(basedir) 
+0

Выглядит хорошо ... «Усекать» по существу «ясно», правильно? – tkbx

+6

Да, открытие файла с флагом 'w' (write) опустошает его при открытии его с помощью' a' (append). – ThiefMaster

+10

Нельзя полагаться на подтверждение немедленного закрытия файла. Это не вопрос чистоты, так как пересчет - это всего лишь деталь реализации. Никакой Python, кроме CPython, не делает этого. Хотите сделать свою программу в пять раз быстрее с PyPy или запустить ее в среде Java/.NET с помощью Jython/IronPython? Слишком плохо, что вы не закрывали эти файлы, теперь ваша программа течет, как сито;) Это особенно ужасно с 2.5, так как 'with' позволяет * легко * закрыть файл своевременно (и даже перед исключениями и круговыми ссылками) ** и ** код становится более понятным для загрузки. – delnan

27

Конечно, существует способ создания файлов без открытия. Это так же просто, как позвонить os.mknod("newfile.txt"). Единственным недостатком является то, что для этого вызова требуются привилегии root в OSX.

+0

Отличная точка. См. Также https://docs.python.org/3/library/os.html – poolie

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