Skip to main content
 首页 » 编程设计

Python 2.7 从utf-8文件读写 "éèàçê"

2025年05月04日13shangdawei

我制作了这个脚本,它删除了所有尾随的空白字符,并用正确的字符替换了所有错误的法语字符。

删除尾随的空白字符有效,但不是关于替换法语字符的部分。

要读/写的文件是用 UTF-8 编码的,所以我在脚本上方添加了 utf-8 声明,但最后每个坏字符(如\u00e9)都被小方 block 替换。

知道为什么吗?

脚本:

# --*-- encoding: utf-8 --*-- 
 
import fileinput 
import sys 
 
CRLF = "\r\n" 
 
ACCENT_AIGU = "\\u00e9" 
ACCENT_GRAVE = "\\u00e8" 
C_CEDILLE = "\\u00e7" 
A_ACCENTUE = "\\u00e0" 
E_CIRCONFLEXE = "\\u00ea" 
 
CURRENT_ENCODING = "utf-8" 
#Getting filepath 
print "Veuillez entrer le chemin du fichier (utiliser des \\ ou /, c'est pareil) :" 
path = str(raw_input()) 
path.replace("\\", "/") 
 
#removing trailing whitespace characters 
for line in fileinput.FileInput(path, inplace=1): 
    if line != CRLF: 
        line = line.rstrip() 
        print line 
        print >>sys.stderr, line 
    else: 
        print CRLF 
        print >>sys.stderr, CRLF 
fileinput.close() 
 
#Replacing bad wharacters 
for line in fileinput.FileInput(path, inplace=1): 
        line = line.decode(CURRENT_ENCODING) 
        line = line.replace(ACCENT_AIGU, "é") 
        line = line.replace(ACCENT_GRAVE, "è") 
        line = line.replace(A_ACCENTUE, "à") 
        line = line.replace(E_CIRCONFLEXE, "ê") 
        line = line.replace(C_CEDILLE, "ç") 
        line.encode(CURRENT_ENCODING) 
        sys.stdout.write(line) #avoid CRLF added by print 
        print >>sys.stderr, line 
fileinput.close() 

编辑

输入文件包含这种类型的文本:

 * Cette m\u00e9thode permet d'appeller le service du module de tourn\u00e9e 
 * <code>rechercherTechnicien</code> et retourne la liste repr\u00e9sentant le num\u00e9ro  
 * de la tourn\u00e9e ainsi que le nom et le pr\u00e9nom du technicien et la dur\u00e9e  
 * th\u00e9orique por se rendre au point d'intervention. 
 *  

编辑2

如果有人感兴趣,请查看最终代码,第一部分替换编码错误的字符,第二部分删除所有正确的尾随空白字符。

# --*-- encoding: iso-8859-1 --*-- 
 
import fileinput 
import re 
 
CRLF = "\r\n" 
 
print "Veuillez entrer le chemin du fichier (utiliser des \\ ou /, c'est pareil) :" 
path = str(raw_input()) 
path = path.replace("\\", "/") 
 
def unicodize(seg): 
    if re.match(r'\\u[0-9a-f]{4}', seg): 
        return seg.decode('unicode-escape') 
    return seg.decode('utf-8') 
 
print "Replacing caracter badly encoded" 
with open(path,"r") as f: 
    content = f.read() 
replaced = (unicodize(seg) for seg in re.split(r'(\\u[0-9a-f]{4})',content)) 
 
with open(path, "w") as o: 
    o.write(''.join(replaced).encode("utf-8")) 
 
print "Removing trailing whitespaces caracters" 
for line in fileinput.FileInput(path, inplace=1): 
    if line != CRLF: 
        line = line.rstrip() 
        print line 
    else: 
        print CRLF 
fileinput.close() 
 
print "Done!" 

请您参考如下方法:

你正在寻找s.decode('unicode_escape'):

>>> s = r""" 
...  * Cette m\u00e9thode permet d'appeller le service du module de tourn\u00e9e 
...  * <code>rechercherTechnicien</code> et retourne la liste repr\u00e9sentant le num\u00e9ro 
...  * de la tourn\u00e9e ainsi que le nom et le pr\u00e9nom du technicien et la dur\u00e9e 
...  * th\u00e9orique por se rendre au point d'intervention. 
...  * 
... """ 
>>> print(s.decode('unicode_escape')) 
 
 * Cette méthode permet d'appeller le service du module de tournée 
 * <code>rechercherTechnicien</code> et retourne la liste représentant le numéro 
 * de la tournée ainsi que le nom et le prénom du technicien et la durée 
 * théorique por se rendre au point d'intervention. 
 * 

在将字符串写入文件之前不要忘记对其进行编码(例如 UTF-8):

writable_s = s.decode('unicode_escape').encode('utf-8')