You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran修改PDB文件指定行后num(h)列序号连续化求助

解决PDB文件从指定行开始连续修正原子序号的Fortran方案

嘿,作为Fortran新手碰到这种文本处理问题太正常了!PDB文件的固定格式确实容易让人头疼,尤其是要精准修改某一列还不破坏其他内容。我来给你一个直接能用的解决方案,帮你把5427行之后的num(h)列改成连续的5428、5429……序列。

核心思路

PDB的ATOM/HETATM行里,原子序号一般是在第7-10位的固定位置(格式为I4)。我们需要:

  1. 逐行读取原PDB文件
  2. 对行号≥5427的行,把序号替换成从5428开始递增的连续数字
  3. 把处理后的内容写入新文件(别直接覆盖原文件,避免出错)

完整代码示例

program fix_pdb_serial
    implicit none
    character(len=256) :: line, infile, outfile
    integer :: iunit, ounit, ierr, line_num, new_serial
    
    ! 设置输入输出文件名
    infile = "input.pdb"   ! 替换成你的原PDB文件名
    outfile = "fixed.pdb"  ! 输出的修正后文件名
    
    ! 打开原文件
    open(newunit=iunit, file=infile, status="old", action="read", iostat=ierr)
    if (ierr /= 0) then
        print *, "Error opening input file: ", infile
        stop
    end if
    
    ! 打开输出文件
    open(newunit=ounit, file=outfile, status="replace", action="write", iostat=ierr)
    if (ierr /= 0) then
        print *, "Error opening output file: ", outfile
        close(iunit)
        stop
    end if
    
    line_num = 0
    new_serial = 5428  ! 从5428开始递增
    
    do
        ! 逐行读取
        read(iunit, "(a)", iostat=ierr) line
        if (ierr /= 0) exit  ! 读到文件末尾退出循环
        
        line_num = line_num + 1
        
        ! 处理5427行及之后的行(注意:如果5427行本身需要修改成5428,就用>=;如果5427行保留原序号,从5428行开始改,就用>)
        if (line_num >= 5427) then
            ! 替换第7-10位的序号为新的连续值,用I4格式(右对齐,占4位)
            write(line(7:10), "(i4)") new_serial
            new_serial = new_serial + 1
        end if
        
        ! 写入处理后的行到输出文件
        write(ounit, "(a)") trim(line)
    end do
    
    ! 关闭文件
    close(iunit)
    close(ounit)
    
    print *, "Done! Fixed PDB saved to: ", outfile
    
end program fix_pdb_serial

关键细节说明

  • 固定格式处理:PDB的原子序号是固定在第7到10列的,所以我们直接修改line(7:10)这个子字符串,用(i4)格式写入新序号,保证对齐和格式正确,不会破坏其他列的内容。
  • 循环逻辑:用do循环逐行读取,直到文件末尾。每处理一行就递增new_serial,确保序号连续。
  • 错误处理:加入了文件打开的错误判断,避免因为文件不存在等问题导致程序崩溃。
  • 行号判断调整:如果你是想从5427行开始把序号改成5428,就用line_num >= 5427;如果5427行的序号保留原样,从5428行开始改成5429,就把判断条件改成line_num > 5427,根据你的需求调整。

你之前用if循环可能遇到的问题

大概率是没处理好PDB的固定格式:比如直接拼接字符串导致列错位,或者序号的格式不对(比如没有占满4位,导致后面的列偏移)。这个方案直接操作固定位置的子字符串,完美解决这个问题。

内容的提问来源于stack exchange,提问作者Vishal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:19:15