Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何只更改txt文件中的一列,而保留所有其他列,并尊重空格?_Python_Python 3.x_Pandas - Fatal编程技术网

Python 如何只更改txt文件中的一列,而保留所有其他列,并尊重空格?

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

我有一个有很多行的文件。为了安全起见,我只是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保持相同的形状。

就像另一个答案一样,我会使用字符串切片来获得最后一列,并使用字符串连接来重新组合该行。但是,对于定点数学,我将使用
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)
这适用于提供的样本,但假设:

  • 切片38:46中的所有数据都是要递增的列数据
  • 列宽是固定的
  • 这是我的完整工作示例:

    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)
    
    这适用于提供的样本,但假设:

  • 切片38:46中的所有数据都是要递增的列数据
  • 列宽是固定的
  • 这是我的完整工作示例:

    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位也可以