为什么我不能将我的文件保存为 utf-8 格式
why can't I save my file as utf-8 format
我想将字符串保存到新的 txt 文件中。
字符串的编码是'utf-8'(我认为是)并且包含一些汉字
但是文件是GB2312
这是我的代码,我省略了一些:
# -*- coding:utf-8 -*-
# Python 3.4 window 7
def getUrl(self, url, coding='utf-8'):
self.__reCompile = {}
req = request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 UBrowser/5.5.9703.2 Safari/537.36')
with request.urlopen(req) as response:
return response.read().decode(coding)
def saveText(self,filename,content,mode='w'):
self._checkPath(filename)
with open(filename,mode) as f:
f.write(content)
joke= self.getUrl(pageUrl)
#some re transform such as re.sub('<br>','\r\n',joke)
self.saveText(filepath+'.txt',joke,'a')
有时会出现 UnicodeEncodeError:
我认为您的终端使用的编码不支持该字符。
Python 处理得很好,我认为是您的输出编码无法处理它。
另见 this question
您的异常在 'saveText' 中抛出,但我看不到您是如何实现它的,所以我会尝试重现错误并给出修复建议。
在 'getUrl' 中你 return 一个解码字符串 ( .decode('utf-8') ) 我的猜测是,在 'saveText' 中你忘记了编码写入文件。
重现错误
为了重现错误,我这样做了:
# String with unicode chars, decoded like in you example
s = 'æøå'.decode('utf-8')
# How saveText could be:
# Encode before write
f = open('test', mode='w')
f.write(s)
f.close()
这给出了类似的异常:
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-36-1309da3ad975> in <module>()
5 # Encode before write
6 f = open('test', mode='w')
----> 7 f.write(s)
8 f.close()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
两种固定方式
您可以执行以下任一操作:
# String with unicode chars, decoded like in you example
s = 'æøå'.decode('utf-8')
# How saveText could be:
# Encode before write
f = open('test', mode='w')
f.write(s.encode('utf-8'))
f.close()
或者您可以尝试使用模块 'codecs':
写入文件
import codecs
# String with unicode chars, decoded like in you example
s = 'æøå'.decode('utf-8')
# How saveText could be:
f = codecs.open('test', encoding='utf-8', mode='w')
f.write(s)
f.close()
希望对您有所帮助。
The encoding of the string is 'utf-8'(I think so) and it contains some Chinese character
您已使用 UTF-8 解码来自远程服务器的响应。一旦它被解码为 Python 字符串,它就不再有效地编码和存储为内存中的 Unicode 点。
您收到的错误是因为 Python 正在尝试使用您的代码页将字符串转换为字节。由于您的 Windows 区域设置,它选择了 GBK,它不支持所有的 Unicode 字符。
要保存,您只需使用指定编码打开输出文件,使用 encoding
参数 open()
(Python 3. 在 Python 2 , 使用 io.open()
).在您的情况下,"UTF-8" 可能是适合使用的编码。
您的 saveText()
方法需要更新为:
def saveText(self,filename,content,mode='w',encoding="utf-8"):
self._checkPath(filename)
with open(filename,mode,encoding) as f:
f.write(content)
您可能 运行 遇到 HTTP 数据问题。当您解码响应时,您假设远程内容是 UTF-8。情况并非总是如此。
您可以分析 HTTP 响应 headers 以获得正确的编码或使用 Requests 库,它会为您完成此操作。您的 URL getter 看起来像:
def getUrl(url):
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 UBrowser/5.5.9703.2 Safari/537.36'}
response = requests.get(url, headers=headers)
response.raise_for_status() # Throw an exception on errors
return response.text
我想将字符串保存到新的 txt 文件中。
字符串的编码是'utf-8'(我认为是)并且包含一些汉字
但是文件是GB2312
这是我的代码,我省略了一些:
# -*- coding:utf-8 -*-
# Python 3.4 window 7
def getUrl(self, url, coding='utf-8'):
self.__reCompile = {}
req = request.Request(url)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 UBrowser/5.5.9703.2 Safari/537.36')
with request.urlopen(req) as response:
return response.read().decode(coding)
def saveText(self,filename,content,mode='w'):
self._checkPath(filename)
with open(filename,mode) as f:
f.write(content)
joke= self.getUrl(pageUrl)
#some re transform such as re.sub('<br>','\r\n',joke)
self.saveText(filepath+'.txt',joke,'a')
有时会出现 UnicodeEncodeError:
我认为您的终端使用的编码不支持该字符。 Python 处理得很好,我认为是您的输出编码无法处理它。
另见 this question
您的异常在 'saveText' 中抛出,但我看不到您是如何实现它的,所以我会尝试重现错误并给出修复建议。
在 'getUrl' 中你 return 一个解码字符串 ( .decode('utf-8') ) 我的猜测是,在 'saveText' 中你忘记了编码写入文件。
重现错误
为了重现错误,我这样做了:
# String with unicode chars, decoded like in you example
s = 'æøå'.decode('utf-8')
# How saveText could be:
# Encode before write
f = open('test', mode='w')
f.write(s)
f.close()
这给出了类似的异常:
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
<ipython-input-36-1309da3ad975> in <module>()
5 # Encode before write
6 f = open('test', mode='w')
----> 7 f.write(s)
8 f.close()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
两种固定方式
您可以执行以下任一操作:
# String with unicode chars, decoded like in you example
s = 'æøå'.decode('utf-8')
# How saveText could be:
# Encode before write
f = open('test', mode='w')
f.write(s.encode('utf-8'))
f.close()
或者您可以尝试使用模块 'codecs':
写入文件import codecs
# String with unicode chars, decoded like in you example
s = 'æøå'.decode('utf-8')
# How saveText could be:
f = codecs.open('test', encoding='utf-8', mode='w')
f.write(s)
f.close()
希望对您有所帮助。
The encoding of the string is 'utf-8'(I think so) and it contains some Chinese character
您已使用 UTF-8 解码来自远程服务器的响应。一旦它被解码为 Python 字符串,它就不再有效地编码和存储为内存中的 Unicode 点。
您收到的错误是因为 Python 正在尝试使用您的代码页将字符串转换为字节。由于您的 Windows 区域设置,它选择了 GBK,它不支持所有的 Unicode 字符。
要保存,您只需使用指定编码打开输出文件,使用 encoding
参数 open()
(Python 3. 在 Python 2 , 使用 io.open()
).在您的情况下,"UTF-8" 可能是适合使用的编码。
您的 saveText()
方法需要更新为:
def saveText(self,filename,content,mode='w',encoding="utf-8"):
self._checkPath(filename)
with open(filename,mode,encoding) as f:
f.write(content)
您可能 运行 遇到 HTTP 数据问题。当您解码响应时,您假设远程内容是 UTF-8。情况并非总是如此。 您可以分析 HTTP 响应 headers 以获得正确的编码或使用 Requests 库,它会为您完成此操作。您的 URL getter 看起来像:
def getUrl(url):
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 UBrowser/5.5.9703.2 Safari/537.36'}
response = requests.get(url, headers=headers)
response.raise_for_status() # Throw an exception on errors
return response.text