как я могу заменить часть файла из другого файла - PullRequest
0 голосов
/ 15 мая 2019

У меня проблема с заменой двух столбцов из одного файла в другой два столбца в другом файле.первый файл содержит 29 строк и два столбца, в то время как второй файл представляет собой огромный файл, содержащий около 1400 строк и различных столбцов.первый файл выглядит так:

    ag-109    3.905E-07  
    am-241    1.121E-06  
    am-243    7.294E-09  
    cs-133    1.210E-05  
    eu-151   2.393E-08  
    eu-153   4.918E-07  
    gd-155   2.039E-08  
    mo-95   1.139E-05  
    nd-143  9.869E-06 
      ..............
      .............

2-й файл выглядит так:

 u-234       101  0  7.471e-06   293   end  
 u-235       101  0  0.0005265   293   end  
 u-236       101  0  0.0001285   293   end  
 u-238       101  0  0.02278     293   end  
 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  
 .........  
 .......
 # the first 29 lines of column1 repeated, and each 29 lines, has one value 
  of column 2.  
  from "101" 29 times, then "102" 29 lines,.... till "1018"
  as below.
 .    
 u-234       1018  0  7.471e-06  293   end  
 u-235       1018  0  0.0005265  293   end  
 u-236       1018  0  0.0001285  293   end  
 u-238       1018  0  0.02278    293   end  
 np-237      1018  0  1.018e-05  293   end  
 pu-238      1018  0  2.262e-06  293   end 

 after the "1018" 
 file2 text continue like this 

    u-234       201 0  8.856E-06 293   end 
    u-235       201 0  7.832E-04 293   end 
    u-236       201 0  8.506E-05 293   end 

я хочу прекратить замену столбцов, когда столбец 2 равен «201», покаконец файла.

/// *** следует отметить, что остальная часть файла2 - это совершенно другой текст и продолжается другими текстами и числами с разной длиной столбцов ******** \.

Кроме того: \\ file1 содержит 29 строк, у меня есть несколько файлов, похожих на file1, все их столбцы должны быть заменены на столбцы file2 по порядку.уточнить: если вы видите в file2 столбце 2 есть «101», поэтому это значение повторяется 29 раз, что связано с file1.это будет продолжаться до тех пор, пока file1_18 не будет заменен в строках "1018" в file2

Я хотел бы уточнить, это довольно сложно объяснить для меня.

Я пытался изменитьпервый столбец file1 со столбцом 1 в file2 и от столбца 2 в file1 до столбца 3 в файле 2.

я столкнулся с двумя проблемами: 1 - я не смог заменить столбцы 2 - как записать целоефайл после изменения столбцов.

Я попытался прочитать оба файла и разбить их на столбцы, а затем прочитать определенные столбцы с условиями.

Я также попытался преобразовать файлы в * .csv, но это испортилопробелы, и он должен быть запущен с системным кодом с конкретным расширением.

  with open('100_60.inp') as f:

       while True:

          line = f.readline()
          if not line:
               break
          columns=re.split(r"\s+",line.strip())
          if len(columns)==6 and columns[5]=='end' and columns[1]!='11': 

             if columns[1]=='201':
                break 

             repla =columns[0]
             compo=columns[3]
             print(repla,compo)  # this will print col1 and col4 of file2


  with open('20_3.2_10_100_18.txt') as s:

           while True:

                nuclide = s.readline()
                if not nuclide:
                   break

                rows = re.split(r"\s+",nuclide.strip())
                material = rows[0]
                com2 = rows[1]
                print(material,com2) # col1 and col2 from file1

вывод должен быть таким:

     ag-109      101  0  3.905E-07  293   end  
     am-241      101  0  1.121E-06  293   end  
     am-243      101  0  7.294E-09  293   end  
     cs-133      101  0  1.210E-05  293   end  
     eu-151      101  0  2.393E-08  293   end  
     eu-153      101  0  4.918E-07  293   end  
     gd-155      101  0  2.039E-08  293   end  

....
....
....

iЯ действительно новичок в Python.Я не знаю, как это закончить.Я не знаю, как написать полный файл после редактирования тоже.

пожалуйста, любая помощь будет оценена.

Заранее спасибо

Ответы [ 2 ]

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

Ваши входные файлы выглядят как текстовые файлы с полями фиксированной ширины.Если вы можете использовать панд, это может быть легко:

# load the input files
df1 = pd.read_fwf('file1.txt', header=None)
df2 = pd.read_fwf('file2.txt', header=None)

# create an empty dataframe and feed it with the length of df1
df3 = pd.DataFrame()
df3[0] = df1[0]
df3[1] = df2.iloc[0:len(df1), 1]
df3[2] = df2.iloc[0:len(df1), 2]
df3[3] = df1[1]
df3[4] = df2.iloc[0:len(df1), 4]
df3[5] = df2.iloc[0:len(df1), 5]

# output a file
with open('output.txt', 'w') as fd:
    fd.write(df3.to_string(header=False, index=False))

После вашего редактирования панды не вариант, поэтому вы должны читать оба файла одновременно и записывать каждую строку выводафайл все еще в то же время.Код может быть:

with open(file1) as f1, open(file2) as f2, open(outfile, '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] != '101':
            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))

Выходной файл выглядит как ожидаемый файл вашего вопроса.

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

Можно использовать dataframe из pandas для замены столбцов с одного на другой.

Попробуйте следующий код (комментарии показывают, что делается):

df = pd.read_csv('file1.txt', sep='\s+', header=None)
df2 = pd.read_csv('file2.txt', sep='\s+', header=None)
df2[0] = df[0]  # replace column in 2nd dataframe with column in first.
df2[3] = df[1]  # similarly replace another column.
print(df2)

Вывод:

        0    1  2             3    4    5
0  ag-109  101  0  3.905000e-07  293  end
1  am-241  101  0  1.121000e-06  293  end
2  am-243  101  0  7.294000e-09  293  end
3  cs-133  101  0  1.210000e-05  293  end
4  eu-151  101  0  2.393000e-08  293  end
5  eu-153  101  0  4.918000e-07  293  end
6  gd-155  101  0  2.039000e-08  293  end

Для записи в файл:

df2.to_csv('outfile.txt', sep=' ', index=False, header=False)

Вывод файла:

ag-109 101 0 3.9049999999999996e-07 293 end
am-241 101 0 1.121e-06 293 end
am-243 101 0 7.294000000000001e-09 293 end
cs-133 101 0 1.21e-05 293 end
eu-151 101 0 2.3930000000000003e-08 293 end
eu-153 101 0 4.918e-07 293 end
gd-155 101 0 2.0390000000000003e-08 293 end

Чтобы выбрать определенные строки по критериям, можно написать:

newdf = df2[(df2[0] == 'u-235') | (df2[0]=='u-238')]
print(newdf)

Вывод:

       0    1  2         3    4    5
1  u-235  101  0  0.000526  293  end
3  u-238  101  0  0.022780  293  end
...