Python在不更改其他数字的情况下替换文件中的特定数字
我有这样的文本文件(更长,这只是其中的几行): 在6。“column”我必须将所有数字都改为1,而不改变其他数字。我试图定义一个函数,但它不起作用(替换_数字)。这意味着脚本运行,一切正常,只是数字没有改变。 下面是我想要的一个例子: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
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