-1
votes

Comment trouver le numéro de ligne avec une chaîne spécifique?

J'ai piraté ensemble un code qui boucle des centaines de fichiers texte et analyse chacun pour une chaîne spécifique. Cela fonctionne bien, mais je veux la modifier pour trouver des lignes qui ne contiennent qu'un caractère d'alimentation de ligne et soustrayez-les. Voici un exemple.

import os

search_path = 'C:\\my_path\\'
file_type = '.txt'
search_str = 'START-OF-DATA'

# Append a directory separator if not already present
if not (search_path.endswith("/") or search_path.endswith("\\")):
    search_path = search_path + "/"

# If path does not exist, set search path to current directory
if not os.path.exists(search_path):
    search_path = "."

# Repeat for each file in the directory
for fname in os.listdir(path=search_path):

    # Apply file type filter
    if fname.endswith(file_type):

        # Open file for reading
        fo = open(search_path + fname)

        # Read the first line from the file
        line = fo.readline()

        # Initialize counter for line number
        line_no = 1

        # Loop until EOF
        while line != '':
            # Search for string in line
            index = line.find(search_str)
            if (index != -1):
                print(fname, "[", line_no, ",", index, "] ", line, sep="")

            # Read next line
            line = fo.readline()

            # Increment line counter
            line_no += 1
        # Close the files
        fo.close()

print('DONE!!')


6 commentaires

ligne = fo.readline (). Strip ("\ n \ r") (dans les deux endroits)?


grep fait déjà cela. Projet d'apprentissage? En outre, cela pourrait probablement sauver la recherche du fichier et publier simplement la fonction pour vérifier un fichier, ici (le conserver est pertinent pour la question, perdez-le) On dirait que vous avez une mauvaise condition de boucle - êtes-vous vraiment complètement fait avec ce fichier Si vous voyez une ligne vide?


si (len (ligne) ~ = 2 ou ligne [0] ~ = '\ n' ou ligne [1] ~ = '\ r'): line_no + = 1


@DDS, je reçois un message "Syntaxe invalide".


@Cristifati, cela n'a pas fonctionné. Si je remplace les deux "ligne = fo.readline ()" Il semble de sauter tout le processus et d'imprimer "Terminé !!". Si je remplace la première "ligne = fo.readline ()", j'ai le même résultat que j'avais initialement.


Désolé: pas égal devrait être! =. si (len (ligne)! = 2 ou ligne [0]! = '\ r ou ligne [1]! =' \ n '): line_no + = 1 (Windows EOL est CRLF Non LFCR)


3 Réponses :


0
votes

Considérez ce code

with open(filename) as file: 
    linenumber = 0
    for line in file.readlines():
        if line.strip():
            handle_line (linenumber, line)
            linenumber += 1


2 commentaires

Merci à tout le monde, mais toutes ces suggestions me donnent exactement les mêmes résultats que j'avais initialement.


Cela me donne réellement 7 pour votre ligne de départ de données. À moins que nous ayons un malentendu - les numéros de ligne sont-ils réellement imprimés physiquement dans le fichier? Si la ligne n'est pas en fait une ligne vide, ce chèque ne fonctionnera pas.



0
votes

supposant que ces numéros de ligne sont en réalité dans le fichier de données. Ensuite, j'ai mal compris à l'origine. Cela va probablement être le moment d'utiliser des expressions régulières.

import re
pattern = re.compile(r'(?P<linenumber>\d+) (?P<content>.*)')
with open(filename) as file:
    # maintain your own custom line number
    my_linenumber = 1

    # let python iterate through the lines
    for line in file.readlines():

        # use the regular expressions module to parse the data
        match = pattern.match(line)
        if match and 2==len(match.groups()):
            file_linenumber = match.groups()[0]
            content = match.groups()[1]

            # remove whitespace and see if anything is left
            if content.strip():
                print (my_linenumber, content)
                my_linenumber += 1


0 commentaires

1
votes

Cela semble fonctionner: xxx


0 commentaires