2014-05-21 15 views
9

Làm cách nào để sử dụng with open() as f: ... để ghi tệp trong thư mục không tồn tại.Python: ghi tệp vào thư mục không tồn tại

Ví dụ:

with open('/Users/bill/output/output-text.txt', 'w') as file_to_write: 
    file_to_write.write("{}\n".format(result)) 

Hãy nói rằng thư mục /Users/bill/output/ không tồn tại. Nếu thư mục không tồn tại, chỉ cần tạo thư mục và ghi tập tin ở đó.

+0

Tôi đã sử dụng [đoạn này] (http://code.activestate.com/recipes/82465-a-friendly-mkdir/) trong nhiều năm và năm . – dabhaid

Trả lời

17

Trước tiên, bạn cần tạo thư mục.

Việc thực hiện mkdir -pfrom this answer sẽ chỉ thực hiện những gì bạn muốn. mkdir -p sẽ tạo bất kỳ thư mục cha nào theo yêu cầu và âm thầm không làm gì nếu nó đã tồn tại.

Ở đây tôi đã thực hiện một phương pháp safe_open_w() trong đó kêu gọi mkdir_p trên một phần thư mục của con đường, trước khi mở tập tin để viết:

import os, os.path 
import errno 

# Taken from https://stackoverflow.com/a/600612/119527 
def mkdir_p(path): 
    try: 
     os.makedirs(path) 
    except OSError as exc: # Python >2.5 
     if exc.errno == errno.EEXIST and os.path.isdir(path): 
      pass 
     else: raise 

def safe_open_w(path): 
    ''' Open "path" for writing, creating any parent directories as needed. 
    ''' 
    mkdir_p(os.path.dirname(path)) 
    return open(path, 'w') 

with safe_open_w('/Users/bill/output/output-text.txt') as f: 
    f.write(...) 
+0

Đây là một câu trả lời tuyệt vời. Chỉ cần làm rõ, hàm 'mkdir_p' được sử dụng trong mã của bạn cũng phải được xác định, sử dụng liên kết được cung cấp. Nó không đi kèm với Python. – huu

+0

@HuuNguyen Đã thêm làm rõ, cảm ơn. Vẫn không chắc chắn tại sao một người nào đó đã bỏ phiếu này. –

+0

Đối với 'exc.errno == errno.EEXIST' tôi gặp lỗi: ' NameError: tên chung 'errno' không được xác định'. Thay đổi nó thành 'exc.errno == 17' đã hoạt động. –

6

Hãy sử dụng tự do của các mô-đun os:

import os 

if not os.path.isdir('/Users/bill/output'): 
    os.mkdir('/Users/bill/output') 

with open('/Users/bill/output/output-text.txt', 'w') as file_to_write: 
    file_to_write.write("{}\n".format(result)) 
+0

Điều này cũng không xử lý việc tạo các thư mục trung gian. –

+0

Tất nhiên là không, và đây là một giả định hoàn toàn về phía tôi. Tôi nghĩ rằng '/ Users/bill' tồn tại. – huu

-1

Bạn chỉ có thể tạo đường dẫn bạn muốn tạo tệp bằng cách sử dụng os.makedirs:

import os 
import errno 

def make_dir(path): 
    try: 
     os.makedirs(path, exist_ok=True) # Python>3.2 
    except TypeError: 
     try: 
      os.makedirs(path) 
     except OSError as exc: # Python >2.5 
      if exc.errno == errno.EEXIST and os.path.isdir(path): 
       pass 
      else: raise 

Nguồn: this SO giải pháp

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