2012-09-29 38 views
166

Tôi muốn tạo tệp có đường dẫn x bằng python. Tôi đã sử dụng os.system(y) nơi y = 'touch %s' % (x). Tôi đã tìm kiếm một phiên bản phi thư mục của os.mkdir, nhưng tôi đã không thể tìm thấy bất cứ điều gì. Có một công cụ như thế này để tạo ra một tập tin mà không cần mở nó, hoặc sử dụng hệ thống hoặc popen/subprocess?Tạo tệp trống bằng python

+2

Tại sao mở cửa xấu? –

+0

@LevLevitsky vì tôi phải đóng lại: P. Tôi phải tạo hàng ngàn tệp và chỉ cần chạm vào tệp có vẻ sạch hơn. – tkbx

+1

FYI, trong khi sử dụng một lệnh bên ngoài cho điều này luôn luôn là xấu, cách thích hợp để thực hiện nó sẽ là 'subprocess.call (['touch', x])' – ThiefMaster

Trả lời

302

Không có cách nào để tạo ra một tập tin mà không cần mở nó os.mknod("newfile.txt") (nhưng nó đòi hỏi quyền root trên OSX). Cuộc gọi hệ thống để tạo tệp thực sự là open() với cờ O_CREAT. Vì vậy, không có vấn đề làm thế nào, bạn sẽ luôn luôn mở tập tin.

Vì vậy, cách dễ nhất để chỉ cần tạo một tập tin mà không cần cắt bỏ nó trong trường hợp nó tồn tại là thế này:

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

Trên thực tế bạn có thể bỏ qua các .close() kể từ khi GC refcounting của CPython sẽ đóng nó lại ngay sau khi tuyên bố open() hoàn thành - nhưng nó sạch hơn để làm điều đó một cách rõ ràng và dựa vào hành vi cụ thể của CPython cũng không tốt.

Trong trường hợp bạn muốn hành vi touch 's (tức cập nhật mtime trong trường hợp tập tin tồn tại):

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

Bạn có thể mở rộng này cũng tạo ra bất kỳ thư mục trong đường dẫn không tồn tại:

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

Có vẻ tốt ... "Cắt ngắn" về bản chất là "rõ ràng", phải không? – tkbx

+6

Có, mở một tập tin có cờ 'w' (viết) làm trống nó trong khi mở nó bằng' a' (phụ lục) thì không. – ThiefMaster

+10

Việc tính toán lại việc đóng tệp ngay lập tức không được dựa vào. Đây không phải là vấn đề sạch sẽ, vì việc đếm ngược chỉ là một chi tiết thực hiện. Không có Python ngoại trừ CPython làm điều đó. Bạn muốn làm cho chương trình của bạn năm lần nhanh hơn với PyPy, hoặc chạy nó trong một môi trường Java/.NET với Jython/IronPython? Cũng quá xấu bạn đã không đóng những tập tin đó, bây giờ chương trình của bạn bị rò rỉ như một cái rây;) Nó đặc biệt khủng khiếp kể từ 2.5, như 'with' làm cho nó * dễ dàng hơn * để đóng tập tin kịp thời (và ngay cả khi đối mặt với ngoại lệ và tham chiếu vòng tròn) ** và ** mã trở nên rõ ràng hơn để khởi động. – delnan

27

Tất nhiên có cách tạo tệp mà không cần mở. Nó dễ dàng như gọi os.mknod("newfile.txt"). Hạn chế duy nhất là cuộc gọi này yêu cầu quyền root trên OSX.

+0

Điểm tuyệt vời. Xem thêm https://docs.python.org/3/library/os.html – poolie

Các vấn đề liên quan