- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在按以下方式调用 os.rename()
后,处理 Bad file descriptor
错误的最佳方法是什么?
f = open('foo.txt', 'rw')
os.rename(f.name, f.name + ".bak")
在文件系统中不再有 foo.txt
而是 foo.txt.bak
然而..
f.name
给出 foo.txt
而不是 foo.txt.bak
但是..
f.write("test")
给出错误的文件描述符
有没有更新文件描述符的好方法?
即使文件已重命名,我是否仍应调用 f.close()
?
最佳答案
您可以编写一个函数来重命名打开的文件。基本上,您关闭、重命名和重新打开文件,同时保留文件位置和模式等属性。重新打开需要对模式进行一些调整——如果文件的模式是“w”,用相同的模式重新打开它会丢失其中的所有内容,所以在这种情况下,我们在重新打开时使用“r+”模式。 (这并不完美,因为它允许对文件进行读取访问,这在以前是没有的,但这是我们能做的最好的了。)你当然会得到一个全新的 file
对象, 这是函数的返回值。
import os
def rename_open_file(fileobj, newname):
name = fileobj.name
mode = fileobj.mode.lower()
posn = fileobj.tell()
fileobj.close()
os.rename(name, newname)
newmode = mode
if "w" in mode: # can't reopen with "w" mode since
newmode = "r+" # it would empty the file; use "r+"
if "b" in mode:
newmode += "b"
fileobj = open(name, newmode)
fileobj.seek(posn)
return fileobj
f = rename_open_file(f, f.name + ".bak")
如果您有多个 file
对象引用打开的文件,这当然无济于事;所有其他引用可能会中断。
警告:文件的 name
属性不一定是完整路径,因此如果您使用相对路径打开文件并在打开文件后更改了目录,则不会工作。如果这是一个问题,您可以编写自己的 open()
在打开时找出文件的完整路径名(使用 os.path.abspath()
)。
此外,打开文件时给出的缓冲区大小不会被保留,因为它不会记录在文件对象的任何位置。编写您自己的 open()
也可以解决这个问题。最简单的方法是子类化 file
。
from os.path import abspath
class open(file):
def __init__(self, filename, mode="r", buffering=-1):
file.__init__(self, abspath(filename), mode, buffering)
self.buffering = buffering
然后您可以将维护缓冲添加到您的函数中:
import os
def rename_open_file(fileobj, newname):
name = fileobj.name
mode = fileobj.mode.lower()
posn = fileobj.tell()
buff = fileobj.buffering
fileobj.close()
os.rename(name, newname)
newmode = mode
if "w" in mode: # can't reopen with "w" mode since
newmode = "r+" # it would empty the file; use "r+"
if "b" in mode:
newmode += "b"
fileobj = open(name, newmode, buff)
fileobj.seek(posn)
return fileobj
您还可以为文件对象编写一个包装器类,而不是子类化file
,并让它通过所有file
对包装对象的方法调用。然后 rename()
可以是包装器的一个方法,并执行上述所有操作。由于调用代码将保留对包装器的引用,因此它不需要知道底层 file
对象是否不同。我将把它留作练习。 :-)
关于python - 在 os.rename() 之后更新文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6697972/
我已经阅读了几个小时的 rsync 文档,但我无法弄清楚如何向 rsync 传达如何仅重命名(而不是重新上传文件夹及其内容)目标文件夹,当它们在资源。 我正在使用 SSH 连接到目的地,本地文件夹是源
我正在使用 MySQL。这是一个例子,我想将表 A 重命名为 B,那么以下语句之间有什么区别: alter table A rename to B; 还有这个: rename table A to B
当我在解决方案资源管理器中选择文件或目录并按下 F2 键时,我试图让 Visual Studio 重命名文件。但是,我还希望 Visual Studio 在我按 F2 时进行重构重命名,并且我在编辑器
我无法让 objcopy --rename-sym 工作。 在一个新的 Android 项目中,我创建了目录 jni 和文件 stub.c: #include #include "dlog.h" j
MKPinAnnotationView 在 iOS 15 中重命名为 MKMarkerAnnotationView。 在 iOS 14 之前,我将 MKPinAnnotationView 子类化为 c
如果您调用 os.rename提供不存在的文件或目录,OSError通过将其设置为 None 来忽略文件名.这是 2.6 中的错误,已在某些更高版本中修复? 您只需执行以下操作即可重现该问题: pyt
假设我的前面板有 100 个按钮,名称为“按钮 1”...“按钮 100”。如何快速将它们全部重命名为“Push Button 1”...“Push Button 100”? 最佳答案 与 Dave_
考虑下面这个愚蠢的例子 theory meta_all imports Main begin lemma strict_subset: "⟦ A ⊂ B ⟧ ⟹ ∃a ∈ B. a ∉ A" appl
我正在尝试使用以下代码重命名节点,我需要将节点的 ID 和新名称传递给 server.aspx 如何获取节点的新名称 如何将这两个值传递到 server.aspx 页面 谢谢 .bind("re
我需要一个脚本,允许我将文件名剥离到文件夹中的文件,并将文件夹名称应用于文件,并在每个文件名的末尾添加一个递增的数字。 因此文件名在其原始状态下看起来像这样: gdgeregdja34gtj.jpg
以前,在突出显示 Java 文件中的变量名称后使用 ALT+COMMAND+R 组合键将进入重命名重构模式。现在,组合键将突出显示的文本替换为注册商标符号。 如何让组合键进入重命名重构模式而不是插入符
我有一个 Linux Qt 应用程序,它创建了一些 QThreads . 我知道当你创建一个线程时,它会继承父名,当我使用 htop 时我可以看到它。或 ps ax -L . 是否可以通过像 ps a
在处理器中,为什么我们不能简单地增加寄存器的数量,而不是拥有一个巨大的重新排序缓冲区并映射寄存器以解决名称依赖关系? 最佳答案 原因很多。 首先,我们经常设计微架构来执行现有架构的程序。添加寄存器会改
rename如果 newname 指向不同的驱动器,实际上会复制文件(至少在 Windows 10 平台上)。 有没有办法避免这种情况?我希望它在这种情况下失败。 假设我要移动 100 GB 的文件。
从业务角度来看,问题就出在这里 我们有许多人们使用的共享文件夹,我们称之为//shared/the/drive。但是,我们的服务器可能知道这个共享驱动器是其他名称,可能是 //ir83pn3br8mw
我从 XML 文件中读出它们的类别,然后重命名并保存它们的年份。因此,文件“XYZ.xml”现在是“News_2014.xml”。 问题是,从 2014 年开始,有多个 XML 文件的类别为“新闻”。
假设您有一个名为 foo 的文件包含一些确定的字节序列 X ,并且您想自动将其替换为名为 bar 的文件包含一个字节序列 Y .这通常使用 rename() 完成系统调用---在这种情况下,通过调用r
我正在尝试重命名用户指定目录中的一堆文件,但它似乎只在用户指定程序运行的目录时才有效。例如,从命令行运行时: ./a.out 。 “NewName.txt” 将起作用,而 ./a.out .. "Ne
这个问题可能看起来有点奇怪,但我会尝试对用例进行一些争论。 假设您有一个二维(笛卡尔)场的通用实现,其维度为 dim1 和 dim2,坐标为 c1 和 c2。 struct Field2D { s
我正在使用一个 php 应用程序,其中有一行用于移动文件。我将该方法包含在一个 try...catch block 中,因此,如果抛出错误,可以管理回滚系统。但是从未捕获到异常,那么重命名会引发任何类
我是一名优秀的程序员,十分优秀!