Python在不更改其他数字的情况下替换文件中的特定数字

Python在不更改其他数字的情况下替换文件中的特定数字,python,python-2.7,text,replace,Python,Python 2.7,Text,Replace,我有这样的文本文件(更长,这只是其中的几行): 在6。“column”我必须将所有数字都改为1,而不改变其他数字。我试图定义一个函数,但它不起作用(替换_数字)。这意味着脚本运行,一切正常,只是数字没有改变。 下面是我想要的一个例子: ATOM 6 H2 LIG Z 1 47.434 34.593 -4.121 1.000 ATOM 7 C LIG Z 1 47.465 33.050 -2.458 1.000 ATOM

我有这样的文本文件(更长,这只是其中的几行):

在6。“column”我必须将所有数字都改为1,而不改变其他数字。我试图定义一个函数,但它不起作用(替换_数字)。这意味着脚本运行,一切正常,只是数字没有改变。 下面是我想要的一个例子:

ATOM      6  H2  LIG Z   1      47.434  34.593  -4.121   1.000
ATOM      7  C   LIG Z   1      47.465  33.050  -2.458   1.000
ATOM      8  O   LIG Z   1      48.004  33.835  -1.687   1.000
ATOM      9  CH1 LIG Z   1      47.586  33.197  -3.960   1.000
ATOM     79  H1  LIG Z   1      46.340  32.495   2.495   1.000
ATOM     80  C1  LIG Z   1      46.992  33.059  -2.874   1.000
ATOM     81  C2  LIG Z   1      46.876  32.765  -1.499   1.000
ATOM     82  C3  LIG Z   1      46.836  31.422  -1.079   1.000
我复制我的整个剧本。评论用匈牙利语

#!/usr/bin/python

import os
import sys
import re


# en kodom
molecules = {"ETH":"LIG", "EOL":"LIG", "THS":"LIG", "BUT":"LIG", "ACN":"LIG",
             "AMN":"LIG", "DFO":"LIG", "DME":"LIG", "BDY":"LIG", "BEN":"LIG",
             "CHX":"LIG", "PHN":"LIG", "ACD":"LIG", "ACT":"LIG", "ADY":"LIG",
             "URE":"LIG"}
numbers = {x: '1' for x in range(1, 50)}

def replace_numbers(i):
    i_list = i.split()
    if i_list[0] == "ATOM":
        i_list[5] = '1      '
        i_list[0] = i_list[0] + '      '
        i_list[1] = i_list[1] + '  '
        i_list[2] = i_list[2] + '  '
        i_list[3] = i_list[3] + ' '
        i_list[4] = i_list[4] + '   '
        i_list[6] = i_list[6] + '  '
        i_list[7] = i_list[7] + '  '
        i_list[8] = i_list[8] + '   '
        i = ''.join(i_list)
        return i


def replace_all(text, dic):
    for z, zs in dic.iteritems():
        text = text.replace(z, zs)
    return text
# en kodom end

def split_file(f, n, dirname):
    data = f.readlines() # az input fajl minden sorat olvassa es listat csinal a sorokbol
    concat_data = "".join(data) # egy olyan szoveget ad vissza ami a data-bol all
    split_data = concat_data.split("HEADER ") # felbontja a concat_data-t, a hatarolojel a HEADER - nincs benne
    header = "" 
    result = []
    for i in split_data:
        if i.startswith("protein"):
            header = i
        if i.startswith("crosscluster"):
            crs_cluster_num = int(re.findall(r"crosscluster\.\d*\.(\d*)\.pdb", i)[0])
                # ez hogy csinalja amit csinal?
            if crs_cluster_num > 16:
                #en kodom
                i = replace_all(i, molecules)
                i = replace_numbers(i)

                #en kodom end
                result.append(i) # hozzaadja a result nevu listahoz

    for output in result:
        with open(str(dirname) + "_output"+str(n)+".pdb","w") as out_file: # az aoutput nevet es helyet adja meg
            out_file.write("HEADER " + header) # hozzaadja a HEADER-t es beirja a proteint
            out_file.write("HEADER " + output) # hozzaadja a HEADER szoveget illetve proteineket egyesevel
            out_file.write("#PROTEINTAG\n#PROBETAG ZYXWVUTSR") # hozzaadja az utolso sorokat a vegehez
            out_file.close()
            n += 1 # ?

    return n


if __name__ == "__main__": # ?
    n = 1
    for dirname, dirnames, filenames in os.walk("/home/georgina/proba"):
        for filename in filenames:
            file_path = str(os.path.join(dirname, filename))
            print dirname
            if filename.endswith(".pdb"):
                file_to_split = open(file_path, "r") # megnyitja a szetbontando fajlt
                n = split_file(file_to_split, n, dirname) # a split_file funkcio behivasa
                file_to_split.close()
我尝试了正则表达式,得到了同样的结果

def replace_numbers(text):
    expr = re.compile(r'(LIG )([A-Z])\s*\d*(\s*)')
    expr.sub(r'\1\2  1,\3', text)
    return text

由于列具有固定的宽度,因此如果不拆分行,则更容易:

def replace_numbers(line):
    if line[:4] == 'ATOM'
        line = line[:24] + ' 1      ' + line[32:]
    return line
好的,我刚想出来(在一些帮助下)xD谢谢你的回答。:)


这是可行的。

以什么方式不起作用?您需要保持所有间距吗?请提供所需输出的示例。脚本运行,文件显示,但数字更改功能未显示。是的,我需要输出与输入非常相似,“列”不能移动。不幸的是,当数字大于10时,列会移动,我认为列不会移动,因为您将
行[25:32]
替换为
1
加上正确的空格数。如果整个空间都是数字,那也没关系;因此,要替换的列从我所想的左侧开始一个字符。我的编辑会处理好的。无论如何,你解决了问题,所以一切都很好。我对你的解决方案唯一的问题是它不是很明显。
def replace_numbers(line):
    if line[:4] == 'ATOM'
        line = line[:24] + ' 1      ' + line[32:]
    return line
def replace_numbers(text):
    expr = re.compile(r'(LIG )([A-Z])\s*\d*(\s*)')
    text = expr.sub(r'\1\2  1\3', text)
    return text