2012-09-29 15 views
166

python kullanarak yol x yolunda bir dosya oluşturmak istiyorum. y = 'touch %s' % (x) adresinde os.system(y) kullanıyorum. os.mkdir'un dizin dışı bir sürümünü aradım ancak hiçbir şey bulamadım. Açmadan veya sistem veya popen/alt işlem kullanmadan dosya oluşturmak için böyle bir araç var mı?python kullanarak boş dosya oluşturma

+2

Neden kötü açılıyor? –

+0

@LevLevitsky çünkü tekrar kapatmam gerekecek: P. Binlerce dosya oluşturmalıyım ve sadece dosyaya dokunmak daha temiz görünüyor. – tkbx

+1

FYI, bunun için bir dış komut kullanılırken, her zaman kötüyse, bunu gerçekleştirmenin uygun yolu "subprocess.call" (['touch', x]) ' – ThiefMaster

cevap

302

o os.mknod("newfile.txt") yoktur açmadan bir dosya oluşturmak için bir yolu yoktur (ama OSX kök ayrıcalıkları gerektirir). Bir dosya oluşturmaya yönelik sistem çağrısı, O_CREAT bayrağına sahip aslında open()'dur. Ne olursa olsun, her zaman dosyayı açacaksın. CPython ait refcounting GC open() deyiminden sonra hemen kapanacak beri

Aslında
open(x, 'a').close() 

Eğer .close() ihmal olabilir:

Yani basitçe varolduğundan ihtimaline karşı kesmeden bir dosya oluşturmak için en kolay yolu şudur bitmiş - ama bunu açıkça yapmak ve CPython'a özgü davranışlara güvenmek daha iyidir.

import os 
def touch(path): 
    with open(path, 'a'): 
     os.utime(path, None) 
Ayrıca mevcut olmayan yolda bir dizin oluşturmak için bu genişletmek olabilir

:

durumda

sen (yani dosya var durumunda mtime güncelleştirmek) touch davranışlarını istiyorum

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

İyi görünüyor ... "Kesin" aslında "açık", değil mi? – tkbx

+6

Evet, 'w' (write) bayrağıyla bir dosya açıldığında 'a' (append) ile açılmadan onu boşaltır. – ThiefMaster

+10

Dosyayı kapatmanın hemen reddedilmesi güvenilmez. Refcounting sadece bir uygulama detayı olduğundan, bu bir temizlik meselesi değildir. CPython dışında Python yok. Programınızı PyPy ile beş kat daha hızlı hale getirmek veya Jython/IronPython ile bir Java/.NET ortamında çalıştırmak mı istiyorsunuz? Bu dosyaları kapatmadığın için çok kötü, şimdi programın bir süzgeç gibi sızıyor;) Özellikle 2'den beri korkunç.5, 'ile' yapar gibi * daha kolay * dosyayı zamanında kapatmak (hatta istisnalar ve dairesel referanslar karşısında) ** ve ** kod önyükleme için daha net hale gelir. – delnan

27

Tabii ki açmadan dosya oluşturmanın bir yolu var. os.mknod("newfile.txt")'u çağırmak kadar kolay. Tek dezavantajı, bu çağrının OSX'te root ayrıcalıklarına sahip olması.

+0

Harika bir nokta. Ayrıca bkz. Https://docs.python.org/3/library/os.html – poolie