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

如何在Python中省略\u2028行分隔符?,python,unicode,utf-8,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 当fh中行的语句找到\u2028并将其视为行尾

我有一个包含非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
当fh中行的语句
找到
\u2028
并将其视为行尾时,出现问题。结果,这条线被分成了两条线

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

您可以执行以下操作:

file_contents = fh.read().replace('\u2028',' ').splitlines()
这将读取文件,用空格替换
\u2028
的所有实例,并将结果字符串拆分为行(因此
文件内容将是一个列表)。因此,您的代码如下所示:

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
您可以这样做:

file_contents = fh.read().replace('\u2028',' ').splitlines()
这将读取文件,用空格替换
\u2028
的所有实例,并将结果字符串拆分为行(因此
文件内容将是一个列表)。因此,您的代码如下所示:

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

字符
u'\u2028'
实际上在unicode中声明为行分隔符()。这可以解释为什么编解码器模块使用它作为线路的终点

在您的情况下,问题来自
编解码器。打开
。事实上,我认为永远不应该使用这种方法。文件规定:

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

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

因此,我的建议是远离
编解码器。打开
并分两个不同的阶段进行处理,首先是io访问,然后是unicode转换:

with open('hw.txt', 'rt') as fd:
    for rawline in fd:
        line = rawline.decode('utf8')
        # process line
顺便说一句,我还用Python3.4测试了它。此代码正常工作:

with open('hw.txt', 'rt', encoding='utf8') as fd:
    for line in fd:
        print ('>', repr(line))
并在第一行显示include
u'\2028'
(Python 3直接给出unicode字符串),而使用
编解码器。open
也会在
u'2028'
上拆分,并在Windows上作为行尾使用
\r\n


TL/DR:除了非常特殊的用例,请远离
编解码器。打开

字符
u'\u2028'
实际上在unicode中声明为行分隔符()。这可以解释为什么编解码器模块使用它作为线路的终点

在您的情况下,问题来自
编解码器。打开
。事实上,我认为永远不应该使用这种方法。文件规定:

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

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

因此,我的建议是远离
编解码器。打开
并分两个不同的阶段进行处理,首先是io访问,然后是unicode转换:

with open('hw.txt', 'rt') as fd:
    for rawline in fd:
        line = rawline.decode('utf8')
        # process line
顺便说一句,我还用Python3.4测试了它。此代码正常工作:

with open('hw.txt', 'rt', encoding='utf8') as fd:
    for line in fd:
        print ('>', repr(line))
并在第一行显示include
u'\2028'
(Python 3直接给出unicode字符串),而使用
编解码器。open
也会在
u'2028'
上拆分,并在Windows上作为行尾使用
\r\n


TL/DR:除了非常特殊的用例,请远离
编解码器。打开

您使用的是什么Python版本?谈到unicode处理,Python2和Python3的行为可能不同。@SergeBallesta Python2.7,我忘了在注释中添加版本。很抱歉。您使用的是什么Python版本?谈到unicode处理,Python2和Python3的行为可能不同。@SergeBallesta Python2.7,我忘了在注释中添加版本。很抱歉。