这段 Python 代码中,“wb” 是什么意思?

161

代码:

file('pinax/media/a.jpg', 'wb')

1
另外,您应该考虑使用open而不是file。在Python 2中,file已被弃用(找不到哪个版本),并已在py3k中删除。(感谢Scott)有关更多信息,请参见此问题 - Luiz Damim
1
在Python 2中已被弃用并在Python 3中被删除的file,请使用open。请参见https://dev59.com/4XVD5IYBdhLWcg3wBm1h。 - Max Ghenis
2
假设这是原帖作者自己的代码并不公平,特别是考虑到问题的性质。显然它曾经是有效的。 - mckenzm
5个回答

161

文件模式,写入和二进制。由于你正在写入一个 .jpg 文件,所以看起来没问题。

但是,如果你想要读取那个 jpg 文件,你需要使用 'rb'

更多信息

在Windows上,如果将'b'添加到模式中,则会以二进制模式打开该文件,因此还有像'rb'、'wb'和'r+b'这样的模式。Python在Windows上区分文本文件和二进制文件;在读取或写入数据时,文本文件中的行尾字符会自动略微更改。这种对文件数据的幕后修改对ASCII文本文件来说很好,但它会破坏像JPEG或EXE文件中那样的二进制数据。


4
具体而言,在Windows中,以文本模式打开的文件,fd.write("foo\n") 实际上会写入磁盘 foo\r\n(请注意\r)。 - Serge Ballesta
4
我很确定'b'在所有平台上都是以二进制模式打开文件,而不仅仅是在Windows上,否则这里会有一个巨大的警告。 - mckenzm

118

wb表示以二进制模式打开文件以进行写操作。

在二进制模式下写入时,Python 不会对数据进行任何更改。但是,在文本模式下(当省略 b 或指定了文本模式 wt 时),Python 将根据默认文本编码对文本进行编码。此外,Python 还会将换行符(\n)转换为特定于平台的换行符,这会破坏像 exepng 等二进制文件。

因此,在编写文本文件(无论是使用纯文本还是类似 CSV 的基于文本的格式)时应使用文本模式,而在编写像图像这样的非文本文件时必须使用二进制模式。

参考资料:

https://docs.python.org/zh-cn/3/tutorial/inputoutput.html#reading-and-writing-files https://docs.python.org/zh-cn/3/library/functions.html#open


1
这可能随时间而有所改变。在运行Python 3.6.8的Ubuntu 18.04上,“二进制模式”绝对很重要。我尝试使用wb选项打开文本文件(CSV格式,最终并不那么重要),但是出现错误。通过改用w选项,我成功地使其正常工作。 - TheDavidJohnson
2
感谢您的评论@TheDavidJohnson。在Python 2.6中,文档指出b模式仅对Windows有影响。现在已从文档中删除了该内容,并且“二进制模式应该用于所有不包含文本的文件”。 - Daniel G
2
当然,@Daniel!我很感激你发布你的解决方案。9年过去了,它仍然非常有用。这是多么棒啊!无论如何,我只是想为像我这样的其他人添加一些新信息,他们可能仍然会发现这很有帮助。干杯! - TheDavidJohnson
2
很好的解释。不过,我有一个澄清:你说“因此,在编写文本文件时应使用文本模式”。为了完整起见,我想回顾一下你之前的评论:“Python在二进制模式下不做任何更改”,并补充说明当你不知道(或不关心)编码但需要读取或写入字节时,或者如果你想保留行尾而不考虑平台时,可以在文本文件上使用二进制模式。 - pcdev

9
这是您打开文件的模式。 "wb"表示您正在写入文件(w),并且以二进制模式(b)进行写入。 请参阅文档了解更多信息:点击这里

-1
我认为它只能以二进制模式写入,你也可以检查其他模式:
  • r:以只读模式打开文件。从文件的开头开始读取,这是open()函数的默认模式。
  • rb:以二进制格式以只读模式打开文件,并从文件的开头开始读取。虽然二进制格式可以用于不同的目的,但通常在处理图像、视频等内容时使用。
  • r+:以读写模式打开文件,将指针放在文件的开头。
  • w:以只写模式打开文件。指针被放置在文件的开头,这将覆盖同名的任何现有文件。如果不存在同名文件,则会创建一个新文件。
  • wb:以二进制模式打开只写文件。
  • w+:以读写模式打开文件。
  • wb+:以二进制模式打开读写文件。
  • a:以追加模式打开文件,向其添加新信息。指针被放置在文件的末尾。如果不存在同名文件,则会创建一个新文件。
  • ab:以二进制模式打开追加文件。
  • a+:以追加和读取模式打开文件。
  • ab+:以二进制模式打开追加和读取文件。

1
欢迎来到Stack Overflow!除了第一行之外,你的回答似乎很可能是由人工智能(例如ChatGPT)完全或部分地撰写,或者是从其他来源复制而来。请注意,在这里禁止发布由人工智能生成的内容(//meta.stackoverflow.com/q/421831)。如果你在回答中使用了人工智能工具,请鼓励你将其删除。如果你从其他地方复制了内容,请务必引用你的来源(https://meta.stackexchange.com/q/160077/902710)。谢谢! - undefined
1
不清楚为什么您要在已经有13年历史、被接受和赞同的问题上添加基本相同的答案。对您来说,找到需要回答的问题或者在旧问题中提供更为新近的信息会更有帮助。谢谢! - undefined
这也不清楚为什么你会在已经写了13年并被接受和赞同的问题上添加基本上相同的答案。你可以更有帮助地寻找需要回答的问题,或者如果旧问题中有过时信息,那就发布更近期的信息。谢谢! - NotTheDr01ds
1
这是典型的剽窃行为。很可能是整篇从 Python 文件处理 这篇文章中抄袭过来的(虽然真正的来源可能还有其他地方,我不知道 StackAbuse 的信誉如何),大致在 "open() 函数可用的访问模式如下" 附近。尽管格式很糟糕(列表格式丢失了)。 - Peter Mortensen
1
@PeterMortensen 对的,我有一种感觉这是“其他来源”,但为了确保我选择了两种可能性;-)。不过,对于其他用户来说,也许应该取消“大胆警告”。 - NotTheDr01ds
显示剩余4条评论

-6
是的,很多人对于理解什么是“b”感到困惑。
实际上,在计算机编程中有各种不同的数据类型。
“b”是“字节”数据类型,它由8位组成。 当你打开一个图像文件时,你会看到“{ 0xFF, 0xF0, 0x0F, 0x11 }”。这些都是文本和它们的字节数据。
是的,没错。 “b”表示二进制数据,但在Python中,“b”的另一种含义是“字节”数据,“wb”表示“写入+字节”...

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