如果一个文件存在,那么以读/写的方式打开它,或者如果它不存在,那么创建它并以读/写的方式打开它,最好的方法是什么?从我读到的,file = open('myfile.dat', 'rw')应该这样做,对吗?

它不适合我(Python 2.6.2),我想知道这是版本问题,还是不应该这样工作或其他什么。

最重要的是,我只需要一个解决问题的办法。我对其他的东西很好奇,但我只需要一个好方法来做开头部分。

封闭的目录可由用户和组写入,而不是其他(我在Linux系统上…所以权限775换句话说),准确的错误是:

IOError:没有这样的文件或目录。


当前回答

Use:

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

注意:文件在打开后必须关闭,而with context管理器是让Python为你处理这一问题的好方法。

其他回答

以下方法的优点是在块的末尾正确地关闭文件,即使在此过程中引发异常。它相当于try(最终),但要短得多。

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

a+打开文件进行追加和读取操作。文件指针为 如果文件存在,则在文件的末尾。文件在 追加模式。如果该文件不存在,则创建一个新文件 阅读和写作。-Python文件模式

Seek()方法设置文件的当前位置。

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

只允许“rwab+”字符;必须恰好有一个“rwa”-请参阅堆栈溢出问题Python文件模式详细信息。

Open ('myfile.dat', 'a')适合我,没问题。

在py3k中,你的代码会引发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

在python-2.6中,它会引发IOError。

所以你想写数据到一个文件,但只有当它还不存在?。

这个问题很容易通过使用鲜为人知的x模式来open()而不是通常的w模式来解决。例如:

 >>> 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'
  >>>

如果文件是二进制模式,则使用模式xb而不是xt。

好的做法是使用以下方法:

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')

如果你想打开它来读写,我假设你不想在打开它的时候截断它,你想在打开它之后能够读取文件。这就是我使用的解决方案:

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