【问题标题】:Is it possible to only use "wb" when opening and overwriting a file?打开和覆盖文件时是否可以只使用“wb”?
【发布时间】:2018-10-26 19:51:48
【问题描述】:

如果我想打开一个文件,解压其中的一个对象,然后再覆盖它,可以直接使用吗

data = {} #Its a dictionary in my code
file = open("filename","wb")
data = pickle.load(file)
data["foo"] = "bar"
pickle.dump(data,file)
file.close()

或者我必须先使用“rb”,然后再使用“wb”(对每个使用 with 语句),这就是我现在正在做的事情。请注意,在我的程序中,在打开文件和关闭文件之间有一个散列算法,这是字典数据的来源,我基本上希望能够只打开一次文件而不必使用语句执行两次

【问题讨论】:

  • 你试过了吗?当您尝试读取以写入模式打开的文件时会发生什么?
  • 当然……有可能。
  • 好吧,我已经测试过了,显然pickle会引发阅读错误:
  • io.UnsupportedOperation: 读取

标签: python file pickle


【解决方案1】:

如果你想读,那么写文件,不要使用涉及w的模式;他们都在打开文件时截断文件。

如果已知文件存在,请使用模式"rb+",它会打开现有文件进行读写。

您的代码只需稍作改动:

# Open using with statement to ensure prompt/proper closing
with open("filename","rb+") as file:
    data = pickle.load(file)  # Load from file (moves file pointer to end of file)
    data["foo"] = "bar"
    file.seek(0)     # Move file pointer back to beginning of file
    pickle.dump(data, file)  # Write new data over beginning of file
    file.truncate()  # If new dump is smaller, make sure to chop off excess data

【讨论】:

  • 现在试试这个,仅供参考,我在原来的问题中忘了做“pickle.dump(data,file)”,现在更新了
  • @JamesGreen:K。我也在答案中修复了它,并重新排序了truncate 步骤(如果在酸洗过程中出现错误,延迟截断会降低数据丢失的几率,并且意味着如果新数据等于或长于旧数据,则文件系统根本不必缩小文件)。
  • 我最终使用了这种方法,但没有“with语句”,而是在开头打开它并在最后关闭它,会按照你说的改变截断顺序,谢谢跨度>
【解决方案2】:

你可以使用wb+打开文件进行读写

这个问题有助于理解每个pythons读写条件的区别,但是在末尾添加+通常总是会打开文件进行读写

Confused by python file mode "w+"

【讨论】:

  • 它会覆盖吗?
  • @JamesGreen:模式wb+ 肯定会覆盖,所以如果文件中的数据对您很重要(看起来确实如此),您不想这样做。如果该文件已知存在,则您是rb+,如果该文件可能不存在(此处不是这种情况),则模式ab+ 将起作用(尽管如果您希望能够读取内容 如果它们存在,则必须紧跟 seek 到位置 0)。
  • 是的,我最终使用了“rb+”,因为我确保检查该文件是否存在于程序的早期,谢谢任何人
猜你喜欢
  • 1970-01-01
  • 2019-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多