1

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

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

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

知道为什么吗?

脚本 :

# --*-- 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!"
4

3 回答 3

5

您正在寻找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.
 *

encode并且在将其写入文件(例如,UTF-8)之前不要忘记您的字符串:

writable_s = s.decode('unicode_escape').encode('utf-8')
于 2013-06-12T08:44:59.803 回答
4

没那么快,而且大部分都很脏,但是......

with open("enc.txt","r") as f:
    content = f.read()

import re

def unicodize(seg):
    if re.match(r'\\u[0-9a-f]{4}', seg):
        return seg.decode('unicode-escape')

    return seg.decode('utf-8')

replaced = (unicodize(seg) for seg in re.split(r'(\\u[0-9a-f]{4})',content))

print(''.join(replaced))

给定输入文件(混合 unicode 转义序列和正确编码的 utf-8 文本):

 * 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.
 * 
 * S'il le désire le technicien peut dormir à l'hôtel

产生结果:

 * 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.
 * 
 * S'il le désire le technicien peut dormir à l'hôtel
于 2013-06-12T09:57:52.290 回答
1

要读取以 utf-8 编码且其中包含非 ascii 字符且字面上包含您还想解码的\, u, 0, 0, e,字符序列的文件:9

import codecs
import re

repl = lambda m: m.group().encode('ascii', 'strict').decode('unicode-escape')
with codecs.open(filename, encoding='utf-8') as file:
    text = re.sub(r'\\u[0-9a-f]{4}', repl, file.read())

注意:通常,非 ascii 字符和 Unicode 转义 ( \uxxxx) 不应混合在一个文件中。使用一种或另一种,但不能同时使用。

要读取/写入的文件以 UTF-8 编码,因此我在脚本上方添加了 utf-8 声明

Python 源代码中的 utf-8 声明仅影响 Python 源代码的字符编码,例如,它允许在字节串和 unicode 文字中使用非 ascii 字符。它对您阅读的文件的字符编码没有影响。

但最终每个坏字符(如 \u00e9)都被小方块取代。

“小方块”可能是打印到控制台的神器。在控制台中尝试此操作以查看是否存在正方形:

>>> s = "\u00e9" # 6 bytes in a bytestring
>>> len(s)
6
>>> u = u"\u00e9" # unicode escape in a Unicode string
>>> len(u)
1
>>> print s
\u00e9
>>> print u
é
>>> b = "é" # non-ascii char in a bytestring
>>> len(b) # note: it is 2 bytes 
2
>>> ub = u"é"  # non-ascii char in a Unicode string
>>> len(ub)
1
>>> print b
é
>>> print ub
é
>>> se = u.encode('ascii', 'backslashreplace') # non-ascii chars are escaped
>>> len(se)
4
>>> (s.decode('unicode-escape') == u == b.decode('utf-8') == ub == 
     se.decode('unicode-escape') == unichr(0xe9))
True
于 2013-06-12T13:01:50.403 回答