如何打开一个文件进行读写,也被截断为0?
我试过了:
f = open(PATH, 'w+')
Run Code Online (Sandbox Code Playgroud)
但是,我无法从文件中读取(f.read()返回空字符串).
也:
f = os.fdopen(os.open(PATH, os.O_RDWR | os.O_TRUNC), 'r+')
Run Code Online (Sandbox Code Playgroud)
与前面的代码相同.
tor*_*rek 13
这是一个模式表:
mode-string | truncate? | create? | what's allowed
-------------+-----------+---------+----------------
r | no | no | reading (only)
w | yes | yes | writing (only)
a | no | yes | writing (only), auto-appends
r+ | no | no | read and write
w+ | yes | yes | read and write
a+ | no | yes | read and (auto-appending) write
Run Code Online (Sandbox Code Playgroud)
请注意,缺少模式("读取和非自动追加写入,不会截断但会创建").如果你想要那个,你必须使用这些os功能.
(使用所有这些,添加b到模式序列的末尾以对字节进行操作.行为不b依赖于Python2与Python3以及universal_newlines选项.)
除了所有这些之外,在用+更新模式打开的任何文件上从"读取模式"切换到"写入模式",反之亦然,在大多数情况下需要搜索操作.请参阅此答案了解更多信息
编辑:以下是os为类Unix系统定义的打开文件的各种操作:
os.open(path, flags, mode)
Run Code Online (Sandbox Code Playgroud)
该path参数非常明显,mode只有在创建文件时才使用该参数(因此如果省略该os.O_CREAT标志则可以省略).如果供应mode,最常见的值0666对应于rw-rw-rw-.用户的"的umask"(见os.umask)会带走不需要的权限,例如,一个的umask 002带走了最后写位,resuling中rw-rw-r--,同时077带走所有,但初期rw-.另外两种常见模式是0777(rwxrwxrwx对于可执行文件)和0600(rw-------对于用户私有文件,例如使用用户电子邮件时的临时文件).
该flags值应包括只有一个os.O_RDONLY,os.O_WRONLY或os.O_RDWR:打开读取头(只),写(只),或两者兼而有之.
对于这些,你可以添加1 os.O_CREAT,意思是"创建文件,如果它不存在"; os.O_TRUNC,意思是"立即将文件截断为零字节"; 和/或os.O_APPEND,意思是"所有os级写入操作在写入之前隐式地寻找当前文件结尾".有可能(取决于OS的香味)是多个标记如O_EXCL,O_NDELAY,O_NOFOLLOW等等.(可能最常用且可靠的是O_EXCL,这意味着"如果这会打开现有文件就会失败",因此只有在结合使用时才真正有用O_CREAT.将两者结合使用,您可以创建一个新文件,您可以保证系统中没有其他合作进程也在使用.O_NOFOLLOW如果存在,则该标志在某些安全上下文中也很有用,以避免符号链接陷阱.)
在所有的情况下,给你提供任何读/写设置在os水平-即O_RDONLY,O_WRONLY或者O_RDWR-如果你再包裹文件描述符与一个Python流os.fdopen,您不能说你没有在自己授予更多的权力open时间.你只能减去一些,也就是说,你可以打开,O_RDWR然后fdopen将流作为只读或只写.此外,当使用fdopen更新模式时,需要在不同I/O方向之间进行搜索或刷新操作的烦人限制仍然存在.
请注意,如果完全遵守a该fdopen级别的(追加)模式,则该O_APPEND模式比模式"强大" (或者使用a带open或的模式io.open,所有这些模式都会导致设置基础O_APPEND模式).这主要与共享文件的协作进程有关:如果两个或多个此类进程打开了文件O_APPEND,只要它们的写入"足够小"(细节随操作系统再次变化),它们的写入就不会混合.如果文件仅作为O_WRONLY或打开O_RDWR,则两个协作进程可以调用底层搜索函数,然后调用底层写入函数,但如果两个相互竞争,则可以覆盖另一个数据.
(某些标志,包括O_APPEND,可以使用fcntl(from import fcntl)与F_SETFL参数关闭和打开.这是Python2的相对较晚的添加.)
1 "添加"这里可能意味着文字添加,但使用按位或|操作更常规.也就是说os.open(os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0666),不是os.open(os.O_RDWR + os.O_CREAT + os.O_TRUNC, 0666).
Pad*_*ham 11
如果要存储数据,请截断使用r+:
with open(PATH,"r+") as f:
line = f.read()
f.seek(0)
f.truncate()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7703 次 |
| 最近记录: |