Tengo datos como los datos de ejemplo a continuación en un archivo de texto. Lo que me gustaría hacer es buscar en el archivo de texto y devolver todo entre "SpecialStuff" y el siguiente ";", como he hecho con el ejemplo publicado. Soy bastante nuevo en Python, por lo que cualquier consejo es muy apreciado, ¿funcionaría algo como .split ()?

Example Data:

stuff:
    1
    1
    1
    23

];

otherstuff:
    do something
    23
    4
    1

];

SpecialStuff
    select
        numbers
        ,othernumbers
        words
;

MoreOtherStuff
randomstuff
@#123


Example Out Put:

select
        numbers
        ,othernumbers
        words
0
user3476463 19 jun. 2017 a las 21:13

3 respuestas

La mejor respuesta

Puedes probar esto:

file = open("filename.txt", "r") # This opens the original file
output = open("result.txt", "w") # This opens a new file to write to
seenSpecialStuff = 0 # This will keep track of whether or not the 'SpecialStuff' line has been seen.
for line in file:
    if ";" in line:
        seenSpecialStuff = 0 # Set tracker to 0 if it sees a semicolon.
    if seenSpecialStuff == 1:
        output.write(line)  # Print if tracker is active 
    if "SpecialStuff" in line:
        seenSpecialStuff = 1 # Set tracker to 1 when SpecialStuff is seen

Esto devuelve un archivo llamado result.txt que contiene:

  select
    numbers
    ,othernumbers
    words

Este código se puede mejorar! Dado que esta es probablemente una tarea, probablemente querrá investigar más sobre cómo hacer que esto sea más eficiente. ¡Espero que pueda ser un punto de partida útil para usted!

¡Salud!

EDITAR

Si desea que el código lea específicamente la línea "SpecialStuff" (en lugar de las líneas que contienen "SpecialStuff"), puede cambiar fácilmente las declaraciones "if" para hacerlas más específicas:

file = open("my.txt", "r")
output = open("result.txt", "w")
seenSpecialStuff = 0
for line in file:
    if line.replace("\n", "") == ";":
        seenSpecialStuff = 0
    if seenSpecialStuff == 1:
        output.write(line)
    if line.replace("\n", "") == "SpecialStuff":
        seenSpecialStuff = 1
1
cosinepenguin 20 jun. 2017 a las 15:13

No use str.split() para eso: str.find() es más que suficiente:

parsed = None
with open("example.dat", "r") as f:
    data = f.read()  # load the file into memory for convinience
    start_index = data.find("SpecialStuff")  # find the beginning of your block
    if start_index != -1:
        end_index = data.find(";", start_index)  # find the end of the block
        if end_index != -1:
            parsed = data[start_index + 12:end_index]  # grab everything in between
if parsed is None:
    print("`SpecialStuff` Block not found")
else:
    print(parsed)

Tenga en cuenta que esto capturará todo entre esos dos, incluidas las nuevas líneas y otros espacios en blanco; también puede hacer parsed.strip() para eliminar los espacios en blanco iniciales y finales si no los desea.

0
zwer 19 jun. 2017 a las 18:33
with open('path/to/input') as infile, open('path/to/output', 'w') as outfile:  # open the input and output files
    wanted = False  # do we want the current line in the output?
    for line in infile:
        if line.strip() == "SpecialStuff":  # marks the begining of a wanted block
            wanted = True
            continue
        if line.strip() == ";" and wanted:  # marks the end of a wanted block
            wanted = False
            continue

        if wanted: outfile.write(line)
0
inspectorG4dget 19 jun. 2017 a las 18:25