Есть ли способ изменить часть файла, но продолжайте читать весь файл - PullRequest
0 голосов
/ 29 мая 2019

У меня есть входной файл для системы кодирования, файл содержит символы, целые числа, тексты и числа с плавающей запятой. и у меня есть другой файл содержит 2 столбца. нет конкретного шаблона для файла. какая-то часть - это только текст, другая как массив, другая как столбцы. мое беспокойство, я хочу изменить определенные столбцы. У меня уже есть модуль кода для изменения столбцов. его чтение из другого файла и изменение значений в другом файле.

проблема в том, что это просто чтение определенных столбцов. он игнорирует данные до или после.

данные в файле 1 примерно так:

       ag-109 4.778E-08
       am-241 3.525E-08
       am-243 1.157E-11
       cs-133 3.820E-06
       eu-151 1.546E-08
       eu-153 1.086E-07
       gd-155 1.018E-08
       mo-95 3.650E-06
       nd-143 3.300E-06

данные выглядят так в файле 2:

        csas6
        gbc-32-keno6
        ce_v7_endf
        read composition
        ........
        (some text and numbers)
        .......
        h-1         10  0 0.0667    293   end
        zr          11  0  0.0432   293   end 
        u-234       101 0 7.471e-06 293   end   #  the columns
        u-235       101 0 0.0005265 293   end   #  that i want
        u-236       101 0 0.0001285 293   end   # to change from 
        u-238       101 0 0.02278   293   end   # another file
        np-237      101 0 1.018e-05 293   end 
        pu-238      101 0 2.262e-06 293   end
        pu-239      101 0 0.000147  293   end
        pu-240      101 0 4.138e-05 293   end
        pu-241      101 0 2.028e-05 293   end  

столбцы после 500 строк, это разные столбцы, которые я не хочу менять, затем текст и массивы.

У меня уже есть другой файл с двумя столбцами, чтобы изменить столбец 1 и 4 из вышеуказанного файла.

Благодаря @Serge он помог для этого модуля, он работает для изменения. но если перед столбцами есть текст, он не работает.

я хочу прекратить изменять, когда столбец 2 станет '201'

после этого я хочу продолжить чтение файла и сохранить его в другом файле после изменения.

как я могу изменить файл и сохранить весь файл после изменения.

with open('file2') as f2, open('file1') as f1, open('out.txt','w') as fout:
    sep = re.compile(r'\s+')    # compile the separator for re
    while True:
        # read a line from each file
        try:
            line1 = next(f1)
            line2 = next(f2)
        except StopIteration:
            break                # stop processing on end of any file

        # split lines in fields
        fields1 = sep.split(line1.strip())
        fields2 = sep.split(line2.strip())

        if fields2[1] == '201':
            break                # stop processing if past 101

        # replace fields and write a line on the output file    
        fields2[0] = fields1[0]
        fields2[3] = fields1[1]
        fout.write(' {}      {}  {}  {}  {}   {} \n'.format(*fields2))

ожидаемые результаты должны быть примерно такими:

        csas6
        gbc-32-keno6
        ce_v7_endf
        read composition
        ........
        (some text and numbers)
        .......
        ag-109      101 0 4.778E-08 293   end    
        am-241      101 0 3.525E-08 293   end   
        am-243      101 0 1.157E-11 293   end    
        cs-133      101 0 3.820E-06 293   end   
        eu-151      101 0 1.546E-08 293   end 
        eu-153      101 0 1.086E-07 293   end
        gd-155      101 0 1.018E-08  293   end
        mo-95       101 0 3.650E-06 293   end
        nd-143      101 0 3.300E-06 293   end 
        ............ #( another columns stops when column 2 ='201'
        ...............
        # mixture of text, arrays numbers....

1 Ответ

0 голосов
/ 29 мая 2019

Добавить еще один цикл while без условия if в конце, чтобы перейти к конечному файлу, что-то вроде этого:

with open('file2') as f2, open('file1') as f1, open('out.txt', 'w') as fout:
sep = re.compile(r'\s+')    # compile the separator for re
while True:
    # read a line from each file
    try:
        line1 = next(f1)
        line2 = next(f2)
    except StopIteration:
        break                # stop processing on end of any file

    # split lines in fields
    fields1 = sep.split(line1.strip())
    fields2 = sep.split(line2.strip())

    if fields2[1] == '201':
        break                # stop processing if past 101

    # replace fields and write a line on the output file
    fields2[0] = fields1[0]
    fields2[3] = fields1[1]
    fout.write(' {}      {}  {}  {}  {}   {} \n'.format(*fields2))
while True:
    # read a line from each file
    try:
        line1 = next(f1)
        line2 = next(f2)
    except StopIteration:
        break                # stop processing on end of any file

    # split lines in fields
    fields1 = sep.split(line1.strip())
    fields2 = sep.split(line2.strip())

    # if fields2[1] == '201':
    #     break                # stop processing if past 101

    # replace fields and write a line on the output file
    fields2[0] = fields1[0]
    fields2[3] = fields1[1]
    fout.write(' {}      {}  {}  {}  {}   {} \n'.format(*fields2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...