36

我正在尝试从文本文件中解析大约 2000 万行,并正在寻找一种方法来对不以问号开头的行进行一些进一步的操作。我想要一个不使用正则表达式匹配的解决方案。我想做的是这样的:

for line in x:
    header = line.startswith('?')
if line.startswith() != header:
        DO SOME STUFF HERE

我意识到该startswith方法需要一个参数,但是是否有任何简单的解决方案可以从不以问号开头的行中获取所有行?在此先感谢您的帮助。

4

4 回答 4

69

使用生成器表达式,我认为最好的方式。

for line in (line for line in x if not line.startswith('?')):
    DO_STUFF

或者你的方式:

for line in x:
    if line.startswith("?"):
        continue
    DO_STUFF

或者:

for line in x:
    if not line.startswith("?"):
        DO_STUFF

这完全取决于您的编程风格。我更喜欢第一个,但也许第二个似乎更简单。但我不太喜欢第三个,因为有很多缩进。

于 2011-07-20T14:19:48.043 回答
7

这是一个很好的单线,非常接近自然语言。

字符串定义:

StringList = [ '__one', '__two', 'three', 'four' ]

执行契约的代码:

BetterStringList = [ p for p in StringList if not(p.startswith('__'))]
于 2018-01-17T15:19:26.570 回答
2

像这样的东西可能是你所追求的:

with open('myfile.txt') as fh:
  for line in fh:
    if line[0] != '?': # strings can be accessed like lists - they're immutable sequences.
      continue
    # All of the processing here when lines don't start with question marks.
于 2011-07-20T14:20:23.797 回答
0

类似于 utdemir 的回答:

from itertools import ifilterfalse  # just "filterfalse" if using Python 3

for line in ifilterfalse(lambda s: s.startswith('?'), lines):
    # DO STUFF

http://docs.python.org/library/itertools.html#itertools.ifilterfalse
http://docs.python.org/dev/py3k/library/itertools.html#itertools.filterfalse

于 2011-07-20T14:29:34.677 回答