【问题标题】:Python: Special characters encodingPython:特殊字符编码
【发布时间】:2013-06-07 04:58:22
【问题描述】:

这是我用来替换文本文件中的特殊字符并将它们连接到单个文件的代码。

# -*- coding: utf-8 -*-

    import os
    import codecs

    dirpath = "C:\\Users\\user\\path\\to\\textfiles"
    filenames = os.listdir(dirpath)

    with codecs.open(r'C:\Users\user\path\to\output.txt', 'w', encoding='utf8') as outfile:
        for fname in filenames:
            currentfile = dirpath+"\\"+fname
            with codecs.open(currentfile, encoding='utf8') as infile:
        #print currentfile
                outfile.write(fname)
                outfile.write('\n')
                outfile.write('\n')

                for line in infile:

                    line = line.replace(u"´ı", "i")
                    line = line.replace(u"ï¬", "fi")
                    line = line.replace(u"fl", "fl")
                    outfile.write (line)

第一个line.replace 工作正常,而其他的则没有(这是有道理的),并且由于没有产生错误,我虽然可能存在“可见性”问题(如果这是术语)。所以我做了这个:

import codecs

currentfile = 'textfile.txt'
with codecs.open('C:\\Users\\user\\path\\to\\output2.txt', 'w', encoding='utf-8') as outfile:
with open(currentfile) as infile:
for line in infile:
if "ï¬" not in line: print "not found!"

它总是返回“未找到!”证明这些字符没有被读取。

在第一个脚本中更改为 with codecs.open('C:\Users\user\path\to\output.txt', 'w', encoding='utf-8') as outfile: 时,我收到此错误:

Traceback (most recent call last):
File C:\\path\\to\\concat.py, line 30, in <module>
outfile.write(line)
File C:\\Python27\\codecs.py, line 691, in write
return self.writer.write(data)
File C:\\Python27\\codecs.py, line 351, in write
data, consumed = self.encode(object, self.errors)
Unicode DecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal
not in range (128)

由于我在 python 方面没有真正的经验,我无法弄清楚,通过已经可用的不同来源:python 文档 (1,2) 和 StackOverflow 中的相关问题 (1,2 )

我被困在这里。有什么建议??欢迎所有答案!

【问题讨论】:

  • 我建议您打印要替换的行和字符的repr。它们可能看起来相同,但在内部是不同的字符。

标签: python text character-encoding replace special-characters


【解决方案1】:

如果您不使用编码,则使用codecs.open() 毫无意义。要么使用codecs.open() with 为读写指定的编码,要么完全放弃它。如果没有编码,codecs.open() 只是 open() 的别名。

这里你真的想指定你正在打开的文件的编解码器,以处理 Unicode 值。当超出 ASCII 字符时,您还应该使用 unicode 文字值;为您的数据指定源文件编码或使用 unicode 转义码:

# -*- coding: utf-8 -*- 
import os
import codecs

dirpath = u"C:\\Users\\user\\path\\to\\textfiles"
filenames = os.listdir(dirpath)

with codecs.open(r'C:\Users\user\path\to\output.txt', 'w', encoding='utf8') as outfile:
    for fname in filenames:
        currentfile = os.path.join(dirpath, fname)
        with codecs.open(currentfile, encoding='utf8') as infile:
            outfile.write(fname + '\n\n')
            for line in infile:
                line = line.replace(u"´ı", u"i")
                line = line.replace(u"ï¬", u"fi")
                line = line.replace(u"fl", u"fl")
                outfile.write (line)

这向解释器指定您使用 UTF-8 编解码器来保存源文件,确保 u"´ı" 代码点被正确解码为 Unicode 值,并在使用 codec.open() 打开文件时使用 encoding确保您读取的行被解码为 Unicode 值,并确保您的 Unicode 值以 UTF-8 格式写入输出文件。

请注意,dirpath 值也是一个 Unicode 值。如果您使用 Unicode 路径,则 os.listdir() 返回 Unicode 文件名,如果这些文件名中包含任何非 ASCII 字符,则这是必不可少的。

如果您执行所有这些操作,很可能您的源代码编码与您从文件中读取的数据不匹配,并且您正试图用几个字节替换错误的编码字节集ASCII 字符。

【讨论】:

  • 我不知道u unicode 转义码,所以我将它添加到我的脚本中。不幸的是,没有任何改变,我总是遇到同样的错误。
  • 什么错误?同一行?这次可能是 UnicodeEncode 异常吗?
  • 您想在代码中独占使用 unicode。这意味着您需要 a) 告诉 Python 您的源文件使用什么编解码器,b) 您正在阅读的文件使用什么编解码器,以及 c) 您正在写入的文件应该使用什么编解码器。你不应该只走一部分。
  • 回溯(最近一次调用最后):文件 C:\\path\\to\\concat.py,第 15 行,在 outfile.write(fname + '\n\n' ) 文件 C:\\Python27\\codecs.py,第 691 行,写入返回 self.writer.write(data) 文件 C:\\Python27\\codecs.py,第 351 行,写入数据,消费 = self。 encode(object, self.errors) Unicode DecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range (128)
  • @LDN-5602:这意味着您正在尝试编写字节字符串(not Unicode 值)并且为了将它们编码为 UTF-8,它们需要被解码首先到Unicode。使用默认编解码器 ASCII 会失败。您确定您也在使用编码打开要读取的文件吗?换句话说,您是否应用了我建议的所有更改?
猜你喜欢
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
相关资源
最近更新 更多