2015-01-22 2 views
2

Я хочу создать пустой файл, используя скрипт Python в среде Unix. Могли бы увидеть различные способы упоминания о достижении того же. Каковы преимущества/ловушки одного над другим.Python создать пустой файл - Unix

os.system('touch abc') 

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

open('abc','a') 

subprocess.call(['touch','abc']) 
+1

Возможный дубликат [Создать пустой файл с использованием python] (http: // stackoverflow.com/questions/12654772/create-empty-file-using-python) –

ответ

6

Ну, для начала, те, которые полагаются на touchявляются не портативными. Они не будут работать под стандартной Windows, например, без установки CygWin, GNUWin32 или другого пакета, предоставляющего утилиту touch.

Они также включают создание отдельного процесса для выполнения работы, что-то, что совершенно ненужным в этом случае.

Из четырех я бы, вероятно, использовал open('abc','a').close(), если цель состоит в том, чтобы попытаться просто создать файл, если он не существует. В моем мнениях,, что делает цель понятной.

Но, если вы пытаетесь создать пустой файл, я, вероятно, буду использовать режим w записи, а не режим a Append.

Кроме того, вероятно, вы также захотите поймать исключение, если, например, вы не можете фактически создать файл.

6

TLDR: использование

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

(или 'w' вместо 'a', если намерение состоит в том, чтобы усечь файл, если он уже существует).

Вызов отдельного процесса для выполнения чего-то, что может сделать сам Python, является расточительным и не переносимым на платформы, где внешняя команда недоступна. (Кроме того, os.system использует два процесса - еще один для оболочки для синтаксического анализа командной строки - и устаревает в пользу subprocess.)

Не закрывать открытую дескриптор файла, когда вы закончили с ним, это плохая практика , и может привести к истощению ресурсов в более крупной программе (у вас закончились файлы, если вы открываете все больше и больше файлов и никогда не закрываете их).

+2

'open()' может блокироваться, если имя соответствует именованному каналу. Вы можете использовать 'os.open()', чтобы открыть его в неблокирующем режиме] (http://stackoverflow.com/a/28084217/4279). – jfs

2

Чтобы создать пустой файл на Unix в Python:

import os 

try: 
    os.close(os.open('abc', os.O_WRONLY | os.O_CREAT | os.O_EXCL | 
        getattr(os, "O_CLOEXEC", 0) | 
        os.O_NONBLOCK | os.O_NOCTTY)) 
except OSError: 
    pass # decide what to consider an error in your case and reraise 
    # 1. is it an error if 'abc' entry already exists? 
    # 2. is it an error if 'abc' is a directory or a symlink to a directory? 
    # 3. is it an error if 'abc' is a named pipe? 
    # 4. it is probably an error if the parent directory is not writable 
    # or the filesystem is read-only (can't create a file) 

Или более портативный вариант:

try: 
    open('abc', 'ab', 0).close() 
except OSError: 
    pass # see the comment above 

Без явных .close() вызовов, реализации Python без подсчета ссылок, таких как PyPy, Jython может задерживать закрытие файла до запуска сборки мусора (он может исчерпать доступные дескрипторы файлов для вашего процесса).

Последний пример может зависеть от FIFO и следовать символическим ссылкам. В моей системе, это эквивалентно:

from os import * 
open("abc", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) 

Кроме того, touch команда обновляет время доступа и изменения времени существующих файлов в текущее время.

+0

Вне контекста игнорирование ошибки является сомнительным советом. Вызывающий абонент должен быть уведомлен каким-либо образом, если запрошенная операция завершится с ошибкой. – tripleee

+0

@tripleee: какая ошибка в этом случае? 'touch dir' имеет нулевой статус выхода, но он сообщает о ошибках разрешения. Код может быть изменен для подавления только определенного класса ошибок. Каждое приложение может выбрать то, что подходит. – jfs

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