Python 如何只更改txt文件中的一列,而保留所有其他列,并尊重空格?
我有一个有很多行的文件。为了安全起见,我只是c/p,从某种意义上说,它给出了我的文件的形状 | Martini system from 2b97.pdb | | 55601 | | 1ALA BB 1 13.904 5.512 1.259 | | 12VAL BB 12 4.199 35.292 21.353 | | 112VAL SCC 113 4.367 5.234 21.445 | | 1113CYS BB 1114 4.041 4.969 21.220 | | 11113CYS SCC11115 4.088 14.816 21.041 | | 19293DEC C55598 19.018 0.828 7.094 | | 9.05570 9.05570 30.02670 | |来自2b97.pdb的马提尼系统| | 55601 | |1ALA BB 1 13.904 5.512 1.259| |12VAL BB 12 4.199 35.292 21.353| |112VAL SCC 113 4.367 5.234 21.445| |1113CYS BB 1114.041 4.969 21.220| |11113CYS SCC11115 4.088 14.816 21.041| |19293年12月C55598 19.018 0.828 7.094| | 9.05570 9.05570 30.02670 | 我需要在最后一列中添加0.1个单位 因此,我的输出文件应该如下所示: | Martini system from 2b97.pdb | | 55601 | | 1ALA BB 1 13.904 5.512 1.359 | | 12VAL BB 12 4.199 35.292 21.453 | | 112VAL SCC 113 4.367 5.234 21.545 | | 1113CYS BB 1114 4.041 4.969 21.320 | | 11113CYS SCC11115 4.088 14.816 21.141 | | 19293DEC C55598 19.018 0.828 7.194 | | 9.05570 9.05570 30.02670 | |来自2b97.pdb的马提尼系统| | 55601 | |1ALA BB 1 13.904 5.512 1.359| |12VAL BB 12 4.199 35.292 21.453| |112VAL SCC 113 4.367 5.234 21.545| |1113CYS BB 1114.041 4.969 21.320| |11113CYS SCC11115 4.088 14.816 21.141| |19293年12月C55598 19.018 0.828 7.194| | 9.05570 9.05570 30.02670 | 最重要的是,我的输出文件应该有完全相同的空格、格式和数据类型。此文件中的所有内容都是字符串 如果不考虑空格、格式和数据类型,则无法使用输出文件在需要的程序中运行 以防万一,我不需要保留初始文件(尽管我认为这部分与我添加无关) 谢谢你的帮助。Python 如何只更改txt文件中的一列,而保留所有其他列,并尊重空格?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个有很多行的文件。为了安全起见,我只是c/p,从某种意义上说,它给出了我的文件的形状 | Martini system from 2b97.pdb | | 55601 | | 1ALA BB 1 13.904 5.512 1.259 | | 12VAL BB 12 4.199 35.292 21.353 | | 112V
我已经尝试过了,但我的问题是,我无法使用python保持相同的形状。就像另一个答案一样,我会使用字符串切片来获得最后一列,并使用字符串连接来重新组合该行。但是,对于定点数学,我将使用
decimal.decimal
:
import fileinput
import decimal
import sys
files = ['x.txt']
for line in fileinput.input(files, inplace=True):
number = line[38:46]
try:
number = decimal.Decimal(number)
number += decimal.Decimal('.1')
number = '{:8}'.format(number)
line = line[:38] + number + line[46:]
except decimal.InvalidOperation:
pass
sys.stdout.write(line)
像另一个答案一样,我将使用字符串切片来获得最后一列,并使用字符串连接来重新组合该行。但是,对于定点数学,我将使用
decimal.decimal
:
import fileinput
import decimal
import sys
files = ['x.txt']
for line in fileinput.input(files, inplace=True):
number = line[38:46]
try:
number = decimal.Decimal(number)
number += decimal.Decimal('.1')
number = '{:8}'.format(number)
line = line[:38] + number + line[46:]
except decimal.InvalidOperation:
pass
sys.stdout.write(line)
与其他答案类似,但这里有另一个选项。字符串反转完成,以执行字符串替换右->左
with open('in.txt', 'r') as fi, open('out.txt', 'w') as fo:
fo.write(fi.readline())
fo.write(fi.readline())
for line in fi.readlines():
try:
old = line[-10:-3]
new = '{:>7.3f}'.format(float(old) + 0.1)
line = line[::-1].replace(old[::-1], new[::-1], 1)[::-1]
except ValueError as _:
pass
finally:
fo.write(line)
与其他答案类似,但这里有另一个选项。字符串反转完成,以执行字符串替换右->左
with open('in.txt', 'r') as fi, open('out.txt', 'w') as fo:
fo.write(fi.readline())
fo.write(fi.readline())
for line in fi.readlines():
try:
old = line[-10:-3]
new = '{:>7.3f}'.format(float(old) + 0.1)
line = line[::-1].replace(old[::-1], new[::-1], 1)[::-1]
except ValueError as _:
pass
finally:
fo.write(line)
我还使用了十进制数学和字符串切片。以下是我的版本:
from decimal import Decimal, InvalidOperation
def add_zero_point_one(data):
new_data = []
for l in data.split('\n'):
try:
d = Decimal(l[38:46]) + Decimal('0.1')
l = l[:38] + str(d).rjust(8) + l[46:]
except InvalidOperation:
pass
new_data.append(l)
return '\n'.join(new_data)
这适用于提供的样本,但假设:
from decimal import Decimal, InvalidOperation
data = '''| Martini system from 2b97.pdb |
| 55601 |
| 1ALA BB 1 13.904 5.512 1.259 |
| 12VAL BB 12 4.199 35.292 21.353 |
| 112VAL SCC 113 4.367 5.234 21.445 |
| 1113CYS BB 1114 4.041 4.969 21.220 |
| 11113CYS SCC11115 4.088 14.816 21.041 |
| 19293DEC C55598 19.018 0.828 7.094 |
| 9.05570 9.05570 30.02670 |'''
def add_zero_point_one(data):
new_data = []
for l in data.split('\n'):
try:
d = Decimal(l[38:46]) + Decimal('0.1')
l = l[:38] + str(d).rjust(8) + l[46:]
except InvalidOperation:
pass
new_data.append(l)
return '\n'.join(new_data)
print(data)
print(add_zero_point_one(data))
我还使用了十进制数学和字符串切片。以下是我的版本:
from decimal import Decimal, InvalidOperation
def add_zero_point_one(data):
new_data = []
for l in data.split('\n'):
try:
d = Decimal(l[38:46]) + Decimal('0.1')
l = l[:38] + str(d).rjust(8) + l[46:]
except InvalidOperation:
pass
new_data.append(l)
return '\n'.join(new_data)
这适用于提供的样本,但假设:
from decimal import Decimal, InvalidOperation
data = '''| Martini system from 2b97.pdb |
| 55601 |
| 1ALA BB 1 13.904 5.512 1.259 |
| 12VAL BB 12 4.199 35.292 21.353 |
| 112VAL SCC 113 4.367 5.234 21.445 |
| 1113CYS BB 1114 4.041 4.969 21.220 |
| 11113CYS SCC11115 4.088 14.816 21.041 |
| 19293DEC C55598 19.018 0.828 7.094 |
| 9.05570 9.05570 30.02670 |'''
def add_zero_point_one(data):
new_data = []
for l in data.split('\n'):
try:
d = Decimal(l[38:46]) + Decimal('0.1')
l = l[:38] + str(d).rjust(8) + l[46:]
except InvalidOperation:
pass
new_data.append(l)
return '\n'.join(new_data)
print(data)
print(add_zero_point_one(data))
到目前为止你试过什么?请发布您的代码到目前为止您尝试了什么?请发布你的代码,我测试了它,它把所有的东西都放在一行。2b97.pdb的马提尼系统正常。55601也可以。从那时起,所有的东西都只粘贴在一行中。我测试了它,它将所有的东西都放在一行中。2b97.pdb的马提尼系统正常。55601也可以。从那时起,所有内容都只粘贴在一行中。浮点数学可能不准确,我建议使用十进制library@ananvodo嗯,对我来说很有用,我得到了Python2.7和Python3的预期输出。5@TheDavidFactor是的,但是小数点后3位是可以的。浮点数可能不准确,我建议使用小数点library@ananvodo隐马尔可夫模型,对我来说很有用,我在Python2.7和3中获得了您的预期输出。5@TheDavidFactor是的,但是小数点后3位也可以