非常抱歉,但是在不说明文件的编码应该是什么的情况下将符号写入文本文件简直是无稽之谈。
乍一看可能并不明显,但文本文件确实是经过编码的,并且可能以不同的方式编码。如果您只有字母(大写和小写,但没有重音)、数字和简单符号(ASCII 码低于 128 的所有内容),一切都应该没问题,因为 ASCII 7 位现在是标准,实际上这些字符在主要编码中具有相同的表示。
但是,一旦您获得真正的符号或重音字符,它们的表示就会因一种编码而异。例如,符号 ● 具有(Python 编码)的 UTF-8 表示:\xe2\x97\x8f。更糟糕的是,它无法以 latin1 (ISO-8859-1) 编码表示。
另一个例子是法语 e 重音 aigu:é 它在 UTF8 中表示为 \xc3\xa9(注意 2 个字节),但在 Latin1 中表示为 \x89(一个单字节)
所以我在我的 Ubuntu 机器中使用 UTF8 编码和命令测试了你的代码
cat myFile.txt ...正确显示了子弹!
sba@sba-ubuntu:~/stackoverflow$ cat myFile.txt
●sba@sba-ubuntu:~/stackoverflow$
(由于您没有在项目符号后添加任何换行符,因此提示紧随其后)
总结:
您的代码正确地将项目符号写入 UTF8 编码的文件。如果您的系统本机使用另一种编码(ISO-8859-1 或其变体 Windows-1252),则您无法对其进行本机转换,因为此编码中根本不存在此字符。
但您始终可以在支持不同编码的文本编辑器中看到它,例如所有主要系统上都存在的出色的vim。
以上证明:
在 Windows 7 计算机上,我打开一个 vim 窗口并指示它接受带有 :set encoding='utf8' 的 utf8。然后我从 OP 粘贴原始代码并将其保存到文件 foo.py。
我打开了一个cmd.exe 窗口并执行了python foo.py(使用Python 2.7):它创建了一个包含3 个字节(十六进制)的文件myFile.txt:e2 97 8f 这是 utf8 表示的bullet ●(我可以用 vim Tools/Hexa convert 确认)。
我什至可以在空闲状态下打开myFile.txt 并实际看到子弹。甚至notepad.exe 也可以显示子弹!
因此,即使在本机不接受 utf-8 的 Windows 7 计算机上,来自 OP 的代码也会正确生成一个文本文件,当使用接受 UTF-8 的文本编辑器打开时包含项目符号 @ 987654337@.
当然,如果我尝试在 latin1 模式下使用 vim 打开myFile.txt,我会得到:â—,在代码页为 850 的 cmd 窗口上,type myFile.txt 显示 ÔùÅ,代码页为 1252(变体latin1) : ——.
总之,原始 OP 代码创建了一个正确的 utf8 编码文件 - 由读取部分来正确解释 utf8。