open () trong Python không tạo tệp nếu nó không tồn tại


660

Cách tốt nhất để mở tệp dưới dạng đọc / ghi nếu nó tồn tại hoặc nếu không, sau đó tạo tệp và mở tệp dưới dạng đọc / ghi? Từ những gì tôi đọc, file = open('myfile.dat', 'rw')nên làm điều này, phải không?

Nó không hoạt động đối với tôi (Python 2.6.2) và tôi tự hỏi liệu đây có phải là sự cố phiên bản hay không nên hoạt động như vậy hoặc là gì.

Điểm mấu chốt là, tôi chỉ cần một giải pháp cho vấn đề. Tôi tò mò về những thứ khác, nhưng tất cả những gì tôi cần là một cách hay để làm phần mở đầu.

Thư mục kèm theo có thể ghi được bởi người dùng và nhóm chứ không phải người khác (Tôi đang sử dụng hệ thống Linux ... vì vậy, quyền 775 nói cách khác) và lỗi chính xác là:

IOError: không có tập tin hoặc thư mục như vậy.


2
Như S.Mark đã đề cập, điều này sẽ "chỉ hoạt động". Là thư mục kèm theo có thể ghi?
Rakis

10
"nó không làm việc cho tôi"? Điều đó có nghĩa là gì, cụ thể? Vui lòng cung cấp thông báo lỗi thực tế.
S.Lott

5
Câu trả lời của muksie dưới đây đã có tác dụng (và cả vấn đề của baloo nữa), nhưng chỉ để hoàn thiện, thư mục kèm theo có thể ghi được bởi người dùng và nhóm chứ không phải người khác (tôi nói trên hệ thống linux ... nói cách khác là 775) lỗi là IOError: không có tệp hoặc thư mục như vậy. Cảm ơn anh em về sự giúp đỡ.
trh178

@ S.Lott: đã xong. xin lỗi vì điều đó.
trh178

đảm bảo tất cả các thư mục hàng đầu của sự filetồn tại
Mục tiêu Jason

Câu trả lời:


804

Bạn nên sử dụng openvới w+chế độ:

file = open('myfile.dat', 'w+')

108
wcắt ngắn tập tin hiện có. tài liệu: Chế độ 'r+', 'w+''a+'mở tập tin cho việc cập nhật (lưu ý rằng 'w+'sẽ cắt cụt các tập tin).
SilentGhost

4
điều này đã lừa cảm ơn bạn. Tôi cảm thấy như một thằng ngốc bây giờ không đọc thông số kỹ thuật. tôi không nghĩ 'rw' thậm chí còn được chấp nhận ở đó. tôi phải nghĩ về điều gì khác
trh178

71
Lưu ý rằng a + tạo một tệp nếu nó không tồn tại và, điều quan trọng nhất là tìm kiếm tệp đến cuối. Vì vậy, nếu bạn đọc ngay sau khi mở theo cách này, bạn sẽ không nhận được gì. Bạn cần tìm kiếm lại từ đầu trước: f.seek (0)
Nick Zalutskiy


120
Đây không phải là giải pháp. Các vấn đề là thư mục . Tập lệnh thiếu các quyền để tạo một tập tin trong thư mục đó, hoặc thư mục đơn giản là không tồn tại. open('myfile.dat', 'w')thế là đủ
Daniel F

137

Ưu điểm của cách tiếp cận sau là tệp được đóng đúng cách ở cuối khối, ngay cả khi có một ngoại lệ được đưa ra trên đường đi. Nó tương đương try-finally, nhưng ngắn hơn nhiều.

with open("file.dat","a+") as f:
    f.write(...)
    ...

a + Mở tệp cho cả nối và đọc. Con trỏ tệp nằm ở cuối tệp nếu tệp tồn tại. Các tập tin mở trong chế độ chắp thêm. Nếu tệp không tồn tại, nó sẽ tạo một tệp mới để đọc và ghi. - Chế độ tập tin Python

Phương thức tìm kiếm () thiết lập vị trí hiện tại của tệp.

f.seek(pos [, (0|1|2)])
pos .. position of the r/w pointer
[] .. optionally
() .. one of ->
  0 .. absolute position
  1 .. relative position to current
  2 .. relative position from end

Chỉ cho phép các ký tự "rwab +"; phải có chính xác một trong những "rwa" - xem chi tiết câu hỏi về chế độ tập tin Stack Overflow .


1
Tôi thử điều này với open (tên tệp, 'a +') dưới dạng myfile: và nhận IOError: [Errno 2] Không có tệp hoặc thư mục như vậy: - tại sao nó không tạo tệp?
Loretta

@Loretta Bạn đã kiểm tra giá trị của filename?
Qwerty

Vâng, tôi đã làm. Nó là một chuỗi unicode. Tôi cũng đã thử với open ('{}. Txt'.format (tên tệp),' a + ') dưới dạng myfile:
Loretta

Tôi không sử dụng một con đường. và tôi đã thử mở ('test.txt', 'a +'), nó có ngoại lệ 'TypeError: ép buộc với Unicode: cần chuỗi hoặc bộ đệm, tìm thấy tệp' trong dòng nếu os.stat (myfile) .st_size == 0:
Loretta

Bạn cần xác định đúng mã hóa để làm việc này. stackoverflow.com/q/728891/3701431
Sergiy Kolodyazhnyy

31

Thực hành tốt là sử dụng như sau:

import os

writepath = 'some/path/to/file.txt'

mode = 'a' if os.path.exists(writepath) else 'w'
with open(writepath, mode) as f:
    f.write('Hello, world!\n')

18
Thật tệ khi kiểm tra một tệp trước khi mở nó, vì nó có thể dẫn đến các điều kiện chủng tộc (tệp bị xóa trước khi mở). Điều kiện chủng tộc đôi khi có thể được sử dụng để khai thác các lỗ hổng trong hệ thống. Chế độ "a +" là cách tốt nhất để mở tệp: nó tạo một tệp mới và nối thêm vào các tệp hiện có. Đừng quên bọc nó trong một lần thử / ngoại trừ.
sleblanc

chế độ điện toán viết hoặc chắp thêm không có hứng thú. Nếu tập tin không tồn tại, chế độ chắp thêm sẽ tạo ra nó.
Jean-François Fabre


25
>>> import os
>>> if os.path.exists("myfile.dat"):
...     f = file("myfile.dat", "r+")
... else:
...     f = file("myfile.dat", "w")

r + có nghĩa là đọc / ghi



38
thậm chí tệ hơn, mã này dễ bị điều kiện cuộc đua. do đó, sau khi kiểm tra xem tệp có tồn tại không, quá trình có thể bị gián đoạn và quá trình khác có thể tạo tệp này.
kháng sinh

Bạn cũng sẽ cần cờ "w +" để cả hai tệp sẽ ở chế độ đọc và ghi.
Matt

14

Vì python 3,4, bạn nên sử dụng pathlibđể "chạm" vào các tập tin.
Đó là một giải pháp thanh lịch hơn nhiều so với những đề xuất trong chủ đề này.

from pathlib import Path

filename = Path('myfile.txt')
filename.touch(exist_ok=True)  # will create file, if it exists will do nothing
file = open(filename)

Điều tương tự với các thư mục:

filename.mkdir(parents=True, exist_ok=True)

2
touchkhông cập nhật thời gian sửa đổi cuối cùng khi sử dụng.
Công viên David

@DavidParks điểm tốt, chỉ cần thử nghiệm nó và nó thực sự đúng trên hệ thống tệp ext4 và python3.7.2. Tôi không nghĩ đó là hành vi có chủ đích hoặc mong muốn, có lẽ đó là một con trăn có lỗi?
Granitosaurus

3
Điều tương tự khi sử dụng touchtại dòng lệnh trong linux, vì vậy tôi giả sử đó là hành vi dự định.
David

11

Câu trả lời của tôi:

file_path = 'myfile.dat'
try:
    fp = open(file_path)
except IOError:
    # If not exists, create the file
    fp = open(file_path, 'w+')

9
'''
w  write mode
r  read mode
a  append mode

w+  create file if it doesn't exist and open it in write mode
r+  open for reading and writing. Does not create file.
a+  create file if it doesn't exist and open it in append mode
'''

thí dụ:

file_name = 'my_file.txt'
f = open(file_name, 'w+')  # open file in write mode
f.write('python rules')
f.close()

Tôi hi vọng cái này giúp được. [FYI đang sử dụng phiên bản python 3.6.2]


6

open('myfile.dat', 'a') làm việc cho tôi, tốt thôi

trong py3k mã của bạn tăng ValueError:

>>> open('myfile.dat', 'rw')
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    open('myfile.dat', 'rw')
ValueError: must have exactly one of read/write/append mode

trong python-2.6 nó tăng lên IOError.


6

Sử dụng:

import os

f_loc = r"C:\Users\Russell\Desktop\myfile.dat"

# Create the file if it does not exist
if not os.path.exists(f_loc):
    open(f_loc, 'w').close()

# Open the file for appending and reading
with open(f_loc, 'a+') as f:
    #Do stuff

Lưu ý: Tệp phải được đóng lại sau khi bạn mở chúng, và với quản lý bối cảnh là một cách tốt đẹp để cho Python chăm sóc này cho bạn.


6

Bạn muốn làm gì với tập tin? Chỉ viết cho nó hoặc cả đọc và viết?

'w', 'a'sẽ cho phép ghi và sẽ tạo tệp nếu nó không tồn tại.

Nếu bạn cần đọc từ một tập tin, tập tin phải tồn tại trước khi mở nó. Bạn có thể kiểm tra sự tồn tại của nó trước khi mở hoặc sử dụng thử / ngoại trừ.


5
Kiểm tra sự tồn tại trước khi mở có thể đưa ra một điều kiện cuộc đua. Có lẽ không phải là một vấn đề lớn trong trường hợp này, nhưng một số điều cần lưu ý.
Daniel Hepper

1
"Nếu bạn cần đọc từ một tập tin, tập tin phải tồn tại trước khi bạn mở nó." Cảm ơn bạn đã tiết kiệm sự tỉnh táo của tôi.
Brian Peterson

5

Tôi nghĩ rằng nó r+không phải rw. Tôi chỉ là người mới bắt đầu, và đó là những gì tôi đã thấy trong tài liệu.


4

Đặt w + để ghi tệp, cắt bớt nếu nó tồn tại, r + để đọc tệp, tạo tệp nếu nó không tồn tại nhưng không ghi (và trả về null) hoặc + để tạo tệp mới hoặc nối thêm vào tệp hiện có.


1

Vì vậy, bạn muốn ghi dữ liệu vào một tệp, nhưng chỉ khi nó không tồn tại?.

Vấn đề này được giải quyết dễ dàng bằng cách sử dụng chế độ x ít được biết đến để mở () thay vì chế độ w thông thường. Ví dụ:

 >>> with open('somefile', 'wt') as f:
 ...     f.write('Hello\n')
...
>>> with open('somefile', 'xt') as f:
...     f.write('Hello\n')
...
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
FileExistsError: [Errno 17] File exists: 'somefile'
  >>>

Nếu tệp ở chế độ nhị phân, hãy sử dụng chế độ xb thay vì xt.


1

Nếu bạn muốn mở nó để đọc và viết, tôi giả sử bạn không muốn cắt ngắn nó khi bạn mở nó và bạn muốn có thể đọc tệp ngay sau khi mở nó. Vì vậy, đây là giải pháp tôi đang sử dụng:

file = open('myfile.dat', 'a+')
file.seek(0, 0)

0

Có thể điều này sẽ giúp

nhập mô-đun os đầu tiên vào tập tin py của bạn

import os

sau đó tạo một biến có tên save_file và đặt nó thành tệp bạn muốn tạo html hoặc txt trong trường hợp này là tệp txt

save_file = "history.txt"

sau đó xác định một hàm sẽ sử dụng phương thức tệp os.path.is để kiểm tra xem tệp có tồn tại không và nếu không nó sẽ tạo một tệp

def check_into():
if os.path.isfile(save_file):
    print("history file exists..... \nusing for writting....")
else:
    print("history file not exists..... \ncreating it..... ")
    file = open(save_file, 'w')
    time.sleep(2)
    print('file created ')
    file.close()

và cuối cùng gọi hàm

check_into()

-2
import os, platform
os.chdir('c:\\Users\\MS\\Desktop')

try :
    file = open("Learn Python.txt","a")
    print('this file is exist')
except:
    print('this file is not exist')
file.write('\n''Hello Ashok')

fhead = open('Learn Python.txt')

for line in fhead:

    words = line.split()
print(words)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.