web-dev-qa-db-fra.com

Quel est le moyen le plus simple d’obtenir toutes les chaînes qui ne commencent pas par un personnage?

J'essaie d'analyser environ 20 millions de lignes d'un fichier texte et je cherche un moyen de faire d'autres manipulations sur des lignes qui ne commencent pas par des points d'interrogation. Je voudrais une solution qui n'utilise pas l'appariement regex. Ce que j'aimerais faire est quelque chose comme ceci:

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

Je réalise que la méthode startswith prend un argument, mais existe-t-il une solution simple pour obtenir toutes les lignes d'une ligne qui NE COMMENCE PAS par un point d'interrogation? Merci d'avance pour l'aide.

17
drbunsen

Utilisez des expressions de générateur, la meilleure façon que je pense. 

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

Ou à votre façon:

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

Ou:

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

Cela dépend vraiment de votre style de programmation. Je préfère le premier, mais peut-être que le deuxième semble plus simple. Mais je n'aime pas trop le troisième en raison de nombreuses indentations.

32
utdemir

Quelque chose comme ceci est probablement ce que vous recherchez:

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.
2
g.d.d.c

Voici un Nice one-liner, qui est très proche du langage naturel.

Définition de la chaîne:

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

Code qui réalise l'acte:

BetterStringList = [ p for p in StringList if not(p.startswith('__'))]
0
WalyKu

Similaire à la réponse d'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

0
JAB