更改打开文件的访问模式

4
打开文件后是否可以更改文件访问模式?
f=open(my_file, 'r')

修改 f 以便能够写入它,或者声明该文件应在通用换行符模式下打开?


是的,重新分配:f = open(my_file, 'w') 举个例子。 - Malik Brahimi
4
@MalikBrahimi 先关闭文件。 - jkd
@jakekimds 当然可以。使用后应该始终关闭文件。 - Malik Brahimi
你可以创建一个新类并添加新方法。 - jkd
7个回答

10

由于Linux和Windows不支持更改文件描述符的权限(至少在Linux中没有更改打开模式的posix函数),因此一旦设置了文件描述符,就无法更改其权限(尽管某些特定于操作系统的技巧存在,但我不建议使用)。

您需要使用其他权限重新打开它。


1

尽管似乎没有办法更改底层描述符的访问模式,但如果您要限制访问(如果要将只读文件更改为可写,则无法实现),则可以在 Python 对象级别上进行一些工作。可以尝试以下代码:

f=open(my_file, 'w+')

f.write = None
f.writelines = None
# etc...

如果你使用的是python2,你需要包装文件对象才能禁用写入方法。虽然你可以将这样修改过的文件对象恢复为可写的(从而可以绕过阻止-顺便说一句,在python中几乎总是这种情况),但它可以模拟只读文件的行为(对于许多情况来说已经足够好了)。

这只适用于Python 3; 在Python 2中,file.write是只读属性。此外,这只是创建了一个实例变量来隐藏类属性; type(f).write(f, ...)仍然可用。 - chepner
@chepner,你可能对Python2的看法是正确的(我已经更新了答案)。我知道你可以绕过这样的阻止,因为你可以恢复对象。在Python中,很多禁止访问的技术都可以被规避 - 你必须依赖程序员足够明智,不要做“愚蠢”的事情。 - skyking

0
你可以按照以下方式打开文件,以便读写。
f = open(my_file, 'r+')

但这只是追加操作,如果我想要同时进行读、写和追加呢? - majidarif

0
假设您已经关闭了文件,只需将其重新分配给一个新的文件对象即可:
f = open(my_file, 'w')

0

假设您有一个仅用于读取的文件对象f_r,您可以使用os.fdopen()来获取与同一文件关联但具有不同模式的文件对象f_w

f_r = open(filename, "r")
f_w = os.fdopen(f_read.fileno(), "a+")
f_w.write("Here I come\n")

然而,如果滥用,这种方法可能会导致痛苦和苦难。由于文件对象进行一些缓冲(如果未禁用),同时使用f_rf_w可能会导致意外结果。此外,重新打开<stdin><stdout>可能会或可能不会做您需要或期望的事情。


0

这是我解决这个问题的方法。在此背景下,我的情况是,文件仅存储在内存中,而不在磁盘上,因此我无法从那里重新打开它。

from io import StringIO

...
bytes = file.read()
string = bytes.decode("utf-8") # or whatever encoding you wanna use
file = StringIO(string)

-1

如果您不想重新打开它,请使用:

f.mode = "mode-to-change-to"#w, a, r, ect.

对于模式,

f.name = "file_name"

对于名称和:

f.encoding = "encoding"#default is UTF-8

用于编码。


编辑


你应该使用:

with open("filename", "mode") as f:
    #do something
    f.mode = "another-mode"
    #do something else

让文件在完成后自动关闭


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接