#source file is encoded in utf8
import urllib2
import re
req = urllib2.urlopen('http://people.w3.org/rishida/scripts/samples/hungarian.html')
c = req.read()#.decode('utf-8')
p = r'title="This is Latin script \(Hungarian language\)">(.+)'
text = re.search(p, c).group(1)
name = text[:10]+'.txt' #file name will have special chars in it
f = open(name, 'wb')
f.write(text) #content of file will have special chars in it
f.close()
x = raw_input('done')
正如您所看到的,脚本可以执行以下操作: - 将已知具有网页中的unicode字符的内容读入变量
(源文件保存在utf-8中,但除非在源代码中实际定义了unicode字符串,否则这应该没有区别......正如您所看到的那样,unicode字符串被动态地定义为变量..在这种情况下,源代码的编码应该无关紧要)
这是我得到的奇怪行为(Windows 7,Python 2.7): 当我不使用解码功能时:
c = req.read()
该文件的名称会出现乱码,但文件的内容将可读(即你可以看到正确的unicode匈牙利字符)
然而,当我使用解码功能时:
c = req.read().decode('utf-8')
打开文件时不会出错(实际上是以'w'模式创建) 并且生成的文件的NAME将是可读的,是的,它现在显示正确的unicode字符。
到目前为止这么好吗? 那么,在尝试将unicode内容写入文件时会出错:
f.write(text) #content of file will have special chars in it
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 8: ordinal not in range(128)
你看,我似乎没有蛋糕,也吃了它... 要么我能正确写出文件的名称,要么我可以正确地写出文件的内容..
我该怎么做?
我也尝试用
编写文件f = codecs.open(name, encoding='utf-8', mode='wb')
但它也有错误..
答案 0 :(得分:4)
您遇到的唯一问题似乎只是原始源文件中的“不可读”文件名。这可以解决您的问题:
f = open(name.decode('utf-8').encode( sys.getfilesystemencoding() ) , 'wb')
答案 1 :(得分:4)
虽然winterTTR的答案确实有效但我已经意识到这种方法很复杂。 相反,您真正需要做的就是编写您写入文件的数据。您不需要编码的名称,名称和内容都将显示出来,并且“可读”#34;。
content = '\xunicode chars'.decode('utf-8')
f = open(content[:5]+'.txt', 'wb')
f.write(content.encode('utf-8'))
f.close()