为什么os.linesep只能在Python中的某些字符串上工作?

为什么os.linesep只能在Python中的某些字符串上工作?,python,line-breaks,Python,Line Breaks,我想以字符串形式读入网页内容并删除所有换行符。为了使我的脚本平台独立,我认为最好使用os.linesep而不是“\n”或“\n\r”。要用其他字符替换不需要的字符,我使用string.replace。它不适用于网页,所以我使用了一个txt文件进行测试。该文件的内容很简单: 这是第一行 这是第二行 为什么linsep不起作用? 我不明白 所以,当我以二进制流的形式读入文件并对其进行解码时,它确实找到了所有的换行符。当我以文本形式阅读时,它不会。我检查了这两个字符串,假设字符串和从二进制流转换而来的

我想以字符串形式读入网页内容并删除所有换行符。为了使我的脚本平台独立,我认为最好使用os.linesep而不是“\n”或“\n\r”。要用其他字符替换不需要的字符,我使用string.replace。它不适用于网页,所以我使用了一个txt文件进行测试。该文件的内容很简单:

这是第一行
这是第二行
为什么linsep不起作用?
我不明白

所以,当我以二进制流的形式读入文件并对其进行解码时,它确实找到了所有的换行符。当我以文本形式阅读时,它不会。我检查了这两个字符串,假设字符串和从二进制流转换而来的假设字符串(如果它们真的是字符串),根据type(),它们看起来都是字符串。 这真让我讨厌,有人能解释一下我在这里的误解吗

以下是我的测试代码:

这是我的输出:

类“str”
这是第一行
这是第二行
为什么linsep不起作用?
我不明白

类“str”
这是第一行
替换这是第二行
替换为什么linsep不起作用?
我不明白
更换


提前谢谢

问题在于,对于
os.linesep
,您假设正在处理的文件是在脚本运行的同一平台上创建的,而事实可能并非如此——特别是对于在各种开发环境中创建的网站

HTTP服务器不会将换行符转换为客户机的平台,而是按原样流式传输数据,希望客户机本身与平台无关(这是大多数现代浏览器的情况)

幸运的是,可用的行分隔符并不多,Python自己的
linesep
实际上只能是两个可能的值之一:
\n
\r\n

因此,我建议将事情简化。首先将
'\r\n'
的任何实例替换为
'\n'
,然后在
'\n'
上拆分:

data = file.read().replace('\r\n', '\n').replace('\n', "REPLACEMENT")

“这个问题被标记为完全重复”。它肯定不是完全重复的:另一个问题是关于解析(二进制与文本模式),而这个问题是关于从字符串中删除行尾。可能相关,但不是重复IMO。感谢这个优雅、多用的解决方案。效果非常好!
data = file.read().replace('\r\n', '\n').replace('\n', "REPLACEMENT")