如何打印符号,如●;在Python中创建文件

如何打印符号,如●;在Python中创建文件,python,symbols,Python,Symbols,我正在尝试写符号●到python中的文本文件。我认为这与编码(utf-8)有关。代码如下: # -*- coding: utf-8 -*- outFile = open('./myFile.txt', 'wb') outFile.write("●") outFile.close() 而不是黑色的“●"我得到了“–-”。我如何解决这个问题?如果您使用的是Python 2,请使用编解码器。打开而不是打开和unicode而不是str: # -*- coding: utf-8 -*- import c

我正在尝试写符号
到python中的文本文件。我认为这与编码(utf-8)有关。代码如下:

# -*- coding: utf-8 -*-
outFile = open('./myFile.txt', 'wb')
outFile.write("●")
outFile.close()

而不是黑色的
“●"
我得到了
“–-”
。我如何解决这个问题?

如果您使用的是Python 2,请使用
编解码器。打开
而不是
打开
unicode
而不是
str

# -*- coding: utf-8 -*-
import codecs
outFile = codecs.open('./myFile.txt', 'wb', 'utf-8')
outFile.write(u"●")
outFile.close()
在Python 3中,将
编码
关键字参数传递给
打开

# -*- coding: utf-8 -*-
outFile = open('./myFile.txt', 'w', encoding='utf-8')
outFile.write("●")
outFile.close()

使用
io
软件包打开文件,使其与
python2
python3
一起工作,并将编码设置为
utf8
,以便工作。打印时,写入时,以unicode字符串的形式写入

import io
outFile = io.open('./myFile.txt', 'w', encoding='utf8')
outFile.write(u'●')
outFile.close()

python2.7.8
python3.4.2

上测试,您的程序所做的是以与程序编辑器相同的编码生成输出文件(顶部的
编码
无关紧要,除非您的程序编辑器使用它来保存文件)。因此,如果使用与程序编辑器使用相同编码的程序打开
myFile.txt
,一切看起来都很好

>>> ec = u'\u25cf' # unicode("●", "UTF-8")
>>> open("/tmp/file.txt", "w").write(ec.encode('UTF-8'))
这并不意味着你的程序适用于所有人

为此,您必须做两件事。首先,您必须指明计算机上文本文件使用的编码。这有点难以检测,但以下操作通常会起作用:

# coding=utf-8  # Put your editor's encoding here

import codecs
import locale
import sys

# Selection of the first non-None, reasonable encoding:
out_encoding = (locale.getlocale()[1]
                or locale.getpreferredencoding()
                or sys.stdin.encoding or sys.stdout.encoding
                # Default:
                or "UTF8")

outFile = codecs.open('./myFile.txt', 'w', out_encoding)
请注意,在文件顶部指定正确的
编码是非常重要的:这必须是程序编辑器的编码

如果您知道输出文件所需的编码,可以直接将其放入
open()
。否则,上述更通用、更便于携带的
out\u编码表达式应该适用于大多数计算机上的大多数用户(即,无论他们选择何种编码,他们都应该能够阅读“●“在生成的文件中(假设计算机的编码可以表示它)

然后必须打印字符串,而不是字节:

outFile.write(u"●")
(注意前面的
u
,意思是“unicode字符串”)


为了更深入地理解手头的问题,我之前的一个答案应该非常有用:。

这应该可以解决问题

# -*- coding: utf-8 -*-
outFile = open('./myFile.txt', 'wb')
outFile.write(u"\u25CF".encode('utf-8'))
outFile.close()

看一看

我很抱歉,但是在文本文件中写入一个符号而不说明文件的编码是什么是完全没有意义的

乍一看可能不明显,但文本文件确实是编码的,并且可能以不同的方式编码。如果您只有字母(大写和小写,但不带重音)、数字和简单符号(所有ASCII代码低于128的内容),这一切都应该很好,因为ASCII 7位现在是一种标准,事实上,这些字符在主要编码中具有相同的表示形式

但是一旦你得到了真正的符号,或者重音字符,它们的表示形式就会随着编码的不同而变化● 具有(Python编码)的UTF-8表示形式:
\xe2\x97\x8f
。更糟糕的是,它不能用拉丁语(ISO-8859-1)编码表示

另一个例子是法语e重音aigu:
用UTF8表示为
\xc3\xa9
(注2字节),但用拉丁语表示为
\x89
(一个单字节)

所以我在我的Ubuntu盒中使用UTF8编码和命令测试了你的代码
cat myFile.txt
…正确显示了子弹

sba@sba-ubuntu:~/stackoverflow$ cat myFile.txt 
●sba@sba-ubuntu:~/stackoverflow$ 
(由于您没有在项目符号后添加任何换行符,因此提示会紧跟其后)

总之:

您的代码以UTF8编码将项目符号正确写入文件。如果您的系统以本机方式使用另一种编码(ISO-8859-1或其变体Windows-1252),则无法以本机方式对其进行转换,因为此编码中根本不存在此字符

但是您可以在支持不同编码的文本编辑器中看到它,就像所有主要系统中存在的优秀编码一样


上述证明:

在Windows 7计算机上,我打开了一个vim窗口,指示它使用
:set encoding='utf8'
接受utf8。然后我从OP粘贴了原始代码,并将其保存到一个文件
foo.py

我打开了一个
cmd.exe
窗口并执行
python foo.py
(使用python 2.7):它创建了一个文件
myFile.txt
,其中包含3个字节(hexa):
e297 8f
,这是项目符号的utf8表示形式
(我可以用vim工具/Hexa convert确认)

我甚至可以在空闲状态下打开
myFile.txt
并实际看到了子弹。甚至
notepad.exe
都可以显示子弹

sba@sba-ubuntu:~/stackoverflow$ cat myFile.txt 
●sba@sba-ubuntu:~/stackoverflow$ 
因此,即使在本机不接受utf-8的Windows 7计算机上,OP中的代码也会正确生成一个文本文件,当使用接受utf-8的文本编辑器打开该文件时,该文件包含项目符号

当然,如果我尝试在latin1模式下用vim打开
myFile.txt
,我会得到:
到-
,在带有代码页850的cmd窗口上,
键入myFile.txt
显示
和代码页1252(latin1的变体)-


总之,原始的操作代码创建了一个正确的utf8编码文件-这取决于阅读部分对utf8的正确解释。

谢谢你的回答!我发现问题是写字板不会显示点,但记事本显示了点。所以实际上它从一开始就工作了。Python 2或3?(提示:Py3更好)尽管如此,上面的代码仍然存在一些问题:它基本上只在(1)您的程序编辑器确实使用UTF-8(可能不是这种情况)和(2)使用与您的程序编辑器相同编码的文本文件查看器的情况下才起作用。您可以看看我的解决方案,以获得一些应该提供的信息”●“在几乎任何机器上,对于几乎任何用户,无论他们选择的编码是什么。@JeromeJ:它是python2@EOL很好!很高兴知道!这仅适用于Python3,并且只有在所需输出为UTF-8时才有效(不必如此)