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!!')
3 Réponses :
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
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.
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
Cela semble fonctionner:
ligne = fo.readline (). Strip ("\ n \ r") code> (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 code>@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 code> (Windows EOL est CRLF Non LFCR)