如何在Python中省略\ _2020行分隔符?

时间:2015-11-25 06:53:12

标签: python unicode utf-8

我有一个包含非ASCII字符的文本文件,我想逐行读取文件。但其中一条线是:

Hello\u2028world!

其中\u2028是行分隔符。

读取文件的脚本是:

# Python 2.7.10
import codecs
with codecs.open('path_to_file', 'r', encoding='utf8') as fh:
    for line in fh:
        // Process each line

当语句for line in fh找到\u2028并将其视为行尾时,就会出现此问题。结果,该线被分成两行。

我如何跳过或替换\u2028并将该行保持在一行?

2 个答案:

答案 0 :(得分:2)

你可以这样做:

file_contents = fh.read().replace('\u2028',' ').splitlines()

这将读取文件,用空格替换\u2028的所有实例,并将结果字符串拆分为行(因此file_contents将是一个列表)。所以你的代码看起来像这样:

import codecs
with codecs.open('path_to_file', 'r', encoding='utf8') as fh:
    file_contents = fh.read().replace('\u2028',' ').splitlines()
    for line in file_contents:
        ## Process each line

答案 1 :(得分:1)

字符u'\u2028'确实在unicode中声明为行分隔符(SEP L)。这可以解释为什么编解码器模块将其用作行尾。

在您的情况下,问题来自codecs.open。事实上,我认为永远不应该使用这种方法。文档说明:

  

注意:   即使未指定二进制模式,文件也始终以二进制模式打开。这样做是为了避免因使用8位值进行编码而导致数据丢失。这意味着在读写时不会自动转换'\ n'。

什么会导致Windows系统出现问题。

所以我的建议是远离codecs.open并处理两个不同的阶段,首先是访问,然后是unicode转换:

with open('hw.txt', 'rt') as fd:
    for rawline in fd:
        line = rawline.decode('utf8')
        # process line
BTW,我也用Python3.4测试了它。此代码可以正常工作:

with open('hw.txt', 'rt', encoding='utf8') as fd:
    for line in fd:
        print ('>', repr(line))

并在第一行显示包含u'\2028'(Python 3直接提供unicode字符串),而使用codecs.open也会在u'2028'上拆分,并以\r\n为终点在Windows上。

TL / DR:除了非常特殊的用例外,请远离codecs.open