python - 匹配文件中的空行
问题描述
1. 匹配文件中的空行最可靠的方法是什么?
2.匹配文件中的空行最有效的方法是什么?
3、以下几种不同的空行匹配方式有什么区别?
语境:
我试图了解在 Python 中检测文件中的空白行的过程中可能存在的一些问题。
我可以想出五种方法来定义:
- BLANKS:使用正则表达式匹配空行
^$
- NEWLINES:使用正则表达式匹配换行符
^\r?\n
- EMPTIES:匹配空字符串,
''
- PNEWLINES:匹配换行符,
'\n'
- STRIPS:将行剥离
strip()
,然后匹配一个空字符串。
[nav] In [3]: i = 0
...: fin = open('warandpeace.txt', 'rt')
...: blanks = []
...: empties = []
...: newlines = []
...: pnewlines = []
...: strips = []
...: NEWLINE = re.compile(r'^\r?\n')
...: BLANK = re.compile(r'^$')
...: for line in fin:
...: if re.search(BLANK, line):
...: blanks.append((i, line))
...: if re.search(NEWLINE, line):
...: newlines.append((i, line))
...: if line == '':
...: empties.append((i, line))
...: if line == '\n':
...: pnewlines.append((i, line))
...: if line.strip == '':
...: strips.append((i, line))
...: i += 1
[nav] In [4]: print((len(blanks), len(empties), len(newlines), len(pnewlines), len(strips)))
(13892, 0, 13892, 13892, 0)
尽管我得到了统一的结果,但它们似乎并不相同。我的输入是来自 Project Gutenberg 的 Leo Tolstoy的 War and Peace 的 utf-8 文本副本,我相信 Windows 行结尾。我不确定还有什么要测试的。
我观察到以下几点:
- BLANKS 和 NEWLINES 都将是跨平台可移植的(即,能够处理 Windows 行尾(实际上我不了解 Mac)。
- 显然, EMPTIES 方法失败了,因为从文件中读取行会保留
\n
,因此它不是空字符串。 - 在 Windows 行结尾的情况下,PNEWLINES 方法将失败。
- 我不知道为什么 STRIPS 方法会失败。我认为它去除了前导和尾随空格,所以它应该可以工作。
- 如果空白行中有空格,所有这些都将失败,这在正则表达式方法的情况下很容易解决(不关心这种情况)。
我关心的是匹配空行的最稳健的方法。我总是'^$'
和 sed 一起使用,但是在 Python 中,老实说,我什至一开始都不理解这些行是如何分割的!尽管 Python 在换行符上拆分,新行仍然保留,这对我来说似乎很奇怪,也违反直觉。
除了表面上的区别之外,所有这些之间的真正区别是什么。例如,为什么'^$'
和'^\r?\n'
等价?哪个是最好的方法?还有哪些其他方法?
解决方案
这就像理论问题,但简单的方法是遵循这个逻辑。
with open(file,'r') as out:
lines = out.readlines()
for line in lines:
if len(line.strip()) == 0:
print('Empty')
推荐阅读
- ffmpeg - 如何在 C 中解码来自这个无名的几乎 UVC 灰度相机的流
- amazon-web-services - AWS 胶水:忽略 JSON 属性中的空格
- java - 弹出窗口不点击链接
- javascript - 如何在 freemysqlhosting.net 上将长数据传递到 mySql 数据库
- python - Python:如何通过无效的分隔符分割字符串<0x0c>
- c++ - webRTC c++中有自定义音频源的功能吗?
- servlets - 文件究竟何时传输到服务器?
- javascript - 连接两个 gatsby 节点
- android - 获取值 ($field) 时,Kotlin 属性处于循环中
- conv-neural-network - YOLO 的输出是如何编码的