2010-03-08 41 views
31

như Khi tôi cố gắng để mở một tập tin trong ghi chế độ với đoạn mã sau:tập tin mở trong chế độ "w": IOError: [Errno 2] Không có tập tin hoặc thư mục

packetFile = open("%s/%s/%s/%s.mol2" % ("dir", "dir2", "dir3", "some_file"), "w")

Cung cấp cho tôi các lỗi sau:

IOError: [Errno 2] No such file or directory: 'dir/dir2/dir3/some_file.mol2'

chế độ "w" nên tạo ra các tập tin nếu nó không tồn tại, phải không? Vậy làm thế nào lỗi này có thể xảy ra?

Trả lời

33

Bạn sẽ thấy lỗi này nếu thư mục chứa các tập tin bạn đang cố gắng để mở không tồn tại, ngay cả khi cố gắng để mở tập tin trong chế độ "w".

Vì bạn đang mở tệp bằng đường dẫn tương đối, có thể bạn đang nhầm lẫn về chính xác thư mục đó là gì. Hãy thử in nhanh để kiểm tra:

import os 

curpath = os.path.abspath(os.curdir) 
packet_file = "%s/%s/%s/%s.mol2" % ("dir", "dir2", "dir3", "some_file") 
print "Current path is: %s" % (curpath) 
print "Trying to open: %s" % (os.path.join(curpath, packet_file)) 

packetFile = open(packet_file, "w") 
1

Kiểm tra xem tập lệnh có quyền ghi vào thư mục đó không. Hãy thử điều này:

chmod a+w dir/dir2/dir3 

Lưu ý rằng điều này sẽ cấp quyền ghi cho mọi người trên thư mục đó.

+2

-1; đây không phải là nguyên nhân có thể gây ra lỗi của OP. Nếu bạn không có quyền ghi vào thư mục, Python sẽ cung cấp cho bạn 'IOError: [Errno 13] Quyền bị từ chối: 'testdir/foo'', không phải là một lỗi' No such file or directory'. –

14

Vì bạn không có dấu gạch chéo 'bắt đầu', tập lệnh python của bạn đang tìm tệp này liên quan đến thư mục làm việc hiện tại (và không phải vào thư mục gốc của hệ thống tệp). Cũng lưu ý rằng các thư mục dẫn đến tệp phải tồn tại!

Và: sử dụng os.path.join để kết hợp các yếu tố của đường dẫn.

ví dụ .: os.path.join("dir", "dir2", "dir3", "myfile.ext")

1

Tôi đã gặp lỗi tương tự, nhưng trong trường hợp của tôi nguyên nhân là, trong Windows, đường dẫn dài hơn ~ 250 ký tự.

+0

Tôi cũng tìm thấy nó là vấn đề về độ dài đường dẫn cửa sổ. – blueray

0

Sự cố tương tự đã xảy ra trong môi trường cửa sổ. Giải pháp là thêm "C:" vào đường dẫn tuyệt đối. Mục tiêu của tôi là để tiết kiệm một số tập tin trong sử dụng máy tính để bàn

file_path = os.path.join(os.environ["HOMEPATH"], os.path.join("Desktop", 
    "log_file.log_%s_%s" %(
    strftime("%Y_%m_%d", localtime()), "number_1"))) 

sau đó tôi đã cố gắng để mở thư mục này để lưu như

file_ref = open(file_path, "w") 

tôi thêm này để chạy

file_ref = open(("C:\\"+file_path), "w") 
Các vấn đề liên quan