如何在换行符上分割Python字符串
在Windows 7的Python 3中,我把一个网页的内容读入了一个字符串。
接下来,我想把这个字符串按照换行符分割成一个列表。
但是我不能直接在我的代码里把换行符作为split()
的参数,因为这样会出现语法错误。
错误信息是:'EOL while scanning string literal',意思是“在扫描字符串时遇到了行尾”
如果我输入字符\
和n
,就会出现Unicode错误。
有没有什么办法可以解决这个问题呢?
2 个回答
a.txt
this is line 1
this is line 2
代码:
Python 3.4.0 (default, Mar 20 2014, 22:43:40)
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> file = open('a.txt').read()
>>> file
>>> file.split('\n')
['this is line 1', 'this is line 2', '']
我在用Linux,不过我想你在Windows上用\r\n
也能正常工作。
✨ 在Python中分割行:
你试过用 str.splitlines()
方法吗?
根据文档:
这个方法会返回字符串中的每一行,按照行的边界进行分割。行的换行符不会包含在结果列表中,除非你给
keepends
参数并且设置为真。
举个例子:
>>> 'Line 1\n\nLine 3\rLine 4\r\n'.splitlines()
['Line 1', '', 'Line 3', 'Line 4']
>>> 'Line 1\n\nLine 3\rLine 4\r\n'.splitlines(True)
['Line 1\n', '\n', 'Line 3\r', 'Line 4\r\n']
哪些分隔符被考虑?
这个方法使用了通用换行符的方法来分割行。
Python 2.X
和 Python 3.X
的主要区别在于,前者使用通用换行符的方法来分割行,所以 "\r"
、"\n"
和 "\r\n"
被认为是8位字符串的行边界,而后者使用了一个更广泛的方式,还包括:
\v
或\x0b
:行制表符(在Python3.2
中添加)。\f
或\x0c
:换页符(在Python3.2
中添加)。\x1c
:文件分隔符。\x1d
:组分隔符。\x1e
:记录分隔符。\x85
:下一行(C1控制码)。\u2028
:行分隔符。\u2029
:段落分隔符。
splitlines 和 split 的区别:
与
str.split()
方法不同,当给定一个分隔符字符串 sep 时,这个方法对于空字符串会返回一个空列表,并且末尾的换行符不会导致多出一行:
>>> ''.splitlines()
[]
>>> 'Line 1\n'.splitlines()
['Line 1']
而 str.split('\n')
返回:
>>> ''.split('\n')
['']
>>> 'Line 1\n'.split('\n')
['Line 1', '']
✂️ 去除多余的空格:
如果你还需要去掉开头或结尾的多余空格,比如被 str.splitlines()
忽略的空格,你可以把 str.splitlines()
和 str.strip()
一起使用:
>>> [str.strip() for str in 'Line 1 \n \nLine 3 \rLine 4 \r\n'.splitlines()]
['Line 1', '', 'Line 3', 'Line 4']
️ 去除空字符串 (''):
最后,如果你想从结果列表中过滤掉空字符串,可以使用 filter()
:
>>> # Python 2.X:
>>> filter(bool, 'Line 1\n\nLine 3\rLine 4\r\n'.splitlines())
['Line 1', 'Line 3', 'Line 4']
>>> # Python 3.X:
>>> list(filter(bool, 'Line 1\n\nLine 3\rLine 4\r\n'.splitlines()))
['Line 1', 'Line 3', 'Line 4']
关于原问题的额外说明:
根据你发布的错误信息和Burhan的建议,问题出在打印上。有一个相关的问题可能对你有帮助: UnicodeEncodeError: 'charmap' codec can't encode - character maps to <undefined>, print function