Tworzę nowe pliki z oryginalnie istniejących w folderze mdp, zmieniając kilka wierszy w tych plikach za pomocą Pythona. Muszę to zrobić dla 1000 plików. Czy ktoś może zasugerować pętlę for, która odczytuje wszystkie pliki i zmienia je oraz tworzy nowe za jednym razem?

W ten sposób muszę zmienić liczbę, po której następuje 'md_' w ścieżce i jest to żmudne, ponieważ jest tutaj 1000 plików.

Próbowałem użyć str (), ale wystąpił błąd „nie można odczytać pliku”

fin = open("/home/abc/xyz/mdp/md_1.mdp", "rt") 
fout = open("/home/abc/xyz/middle/md_1.mdp", "wt")

for line in fin:
fout.write(line.replace('integrator               = md', 'integrator    
= md-vv'))
fin = open("/home/abc/xyz/middle/md_1.mdp", "rt")
fout = open("/home/abc/xyz/mdb/md_1.mdp", "wt")

for line in fin:
fout.write(line.replace('dt                       = 0.001', 'dt                       
= -0.001'))

fin.close()
fout.close()
-1
accidental_coder 26 marzec 2020, 11:51

2 odpowiedzi

Najlepsza odpowiedź

os.listdir(path) jest Twoim przyjacielem:

import os

sourcedir = "/home/abc/xyz/mdp"
destdir = "/home/abc/xyz/middle"

for filename in os.listdir(sourcedir):
    if not filename.endswith(".mdp"):
        continue

    source = os.path.join(sourcedir, filename)
    dest = os.path.join(destdir, filename)

    # with open(xxx) as varname makes sure the file(s)
    # will be closed whatever happens in the 'with' block
    # NB text mode is the default, and so is read mode
    with open(source) as fin, open(dest, "w") as fout:
        # python files are iterable... avoids reading
        # the whole file in memory at once
        for line in fin:
            # will only work for those exact strings,
            # you may want to use regexps if number of
            # whitespaces vary etc
            line = line.replace("dt = 0.001", "dt = -0.001")
            line = line.replace(
                'integrator               = md',
                'integrator    = md-vv'
                )
            fout.write(line)
0
bruno desthuilliers 26 marzec 2020, 12:33

Zakładając, że chcesz edytować wszystkie pliki znajdujące się w folderze mdp, możesz zrobić coś takiego.

import os

dir = "/home/abc/xyz/mdp/"
for filename in os.listdir(dir):
    with open(dir + filename, "r+") as file:
        text = file.read()
        text = text.replace("dt = 0.001", "dt = -0.001")
        file.seek(0)
        file.write(text)
        file.truncate()

Spowoduje to przejrzenie każdego pliku i zmianę go za pomocą str.replace ().

Jeśli w folderze mdp znajdują się inne pliki, których nie chcesz edytować, możesz użyć instrukcji i if-statement, aby sprawdzić poprawną nazwę pliku. Dodaj coś takiego, aby zamknąć instrukcję open .

if filename.startswith("md_")
-1
Simon W 26 marzec 2020, 09:15