Python 2.7阅读和写作“éèàçê”从utf-8文件 [英] Python 2.7 reading and writing "éèàçê" from utf-8 file

查看:331
本文介绍了Python 2.7阅读和写作“éèàçê”从utf-8文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



要读/写的文件是用UTF-8编码的,所以我在脚本上面添加了utf-8声明,



任何想法为什么?



脚本:

/ p>

 # -  *  -  encoding:utf-8  -  *  -  

import fileinput
import sys

CRLF =\r\\\


ACCENT_AIGU =\\\\é
ACCENT_GRAVE =\\\ \\ u00e8
C_CEDILLE =\\\\ç
A_ACCENTUE =\\\\à
E_CIRCONFLEXE =\\\\ê

CURRENT_ENCODING =utf-8
#Getting filepath
printVeuillez entrer le chemin du fichier(utiliser des \\ ou /,c'est pareil):
path = str ($)
path.replace(\\,/)

#删除尾部空格字符
在fileinput.FileInput inplace = 1):
if line!= CRLF:
line = line.rstrip()
print line
print>> sys.stderr,line
else:
print CRLF
print>> sys.stderr,CRLF
fileinput.close()

#更换坏字符
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通过print添加CRLF
print>> sys.stderr,line
fileinput .close()



EDIT



输入文件包含此类文本:

  * Cette m \\\éthode permet d'appeller le service du module de tourn u00e9e 
*< code> rechercherTechnicien< / code> et retourne la liste repr\\\ésentant le num\\\éro
* de la tournne \\\ée ainsi que le nom et le pr \\\énom du technicien et la dur \\\ée
* th \ u00e9orique por se rendre au point d'intervention。
*



EDIT2



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

  # -  *  -  encoding:iso-8859-1  -  *  -  

import fileinput
import re

CRLF =\r\
path = str(raw_input())



$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ b path = path.replace(\\,/)

def unicodize(seg):
如果re.match(r'\\u [0 -9a-f] {4}',seg):
return seg.decode('unicode-escape')
return seg.decode('utf-8')
$ b b打印代替错误编码的caracter
打开(路径,r)为f:
content = f.read()
replaced =(unicodize .split(r'(\\u [0-9a-f] {4})',content))

打开(路径w)为o:$ b $

print删除尾部空白字符
在fileinput.FileInput(path, inplace = 1):
if line!= CRLF:
line = line.rstrip()
打印行
else:
打印CRLF
fileinput。 close()

printDone!


解决方案

不是那么快, 。

 以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')

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

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


  * 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\\ \\ u00e9e ainsi que le nom et le pr \\\énom du technicien
* et la dur\\ \\ u00e9e
* th \\\éorique por se rendre au point d'intervention。
*
* s'il ledésirele technicien peut dormiràl'hôtel

产生这个结果:

  * Cetteméthodepermet d'appeller le service du module de 
*tournée
*< code> rechercherTechnicien< / code> et retourne la liste
*représentantlenuméro
* de latournéeainsi que le nom et leprénomdu technicien
* et ladurée
*théoriquepor se rendre au point d'介入。
*
* s'il ledésirele technicien peut dormiràl'hôtel


I made this script which removes every trailing whitespace characters and replace all bad french characters by the right ones.

Removing the trailing whitespace characters works but not the part about replacing the french characters.

The file to read/write are encoded in UTF-8 so I added the utf-8 declaration above my script but in the end every bad characters (like \u00e9) are being replaced by litte square.

Any idea why?

script :

# --*-- 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()

EDIT

the input file contains this type of text :

 * 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.
 * 

EDIT2

Final code if someone is interested, the first part replaces the badly encoded caracters, the second part removes all right trailing whitespaces caracters.

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

解决方案

Not so quick, and mostly dirty, but...

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))

Given that input file (mixing unicode escaped sequences and properly encoded utf-8 text):

 * 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

Produce that result:

 * 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

这篇关于Python 2.7阅读和写作“éèàçê”从utf-8文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆