我有一个包含非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
并将该行保持在一行?
答案 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
!