【问题标题】:Adding data to a column and append it将数据添加到列并附加它
【发布时间】:2021-09-27 08:27:31
【问题描述】:

我在文件 input.txt 中有一个输入数据。我想在第 4 列的每一行添加 200,并希望以与原始格式相同的格式附加到它旁边。

输入.txt

>   >   >
0.000   5.064   -0.15835E-01 -7.755619582136471027e-03
0.700   9.064   -0.21715E-02 -1.302134466433525067e-02
0.800   5.064   0.18954E-01 -1.691809184964498253e-02
>   >   >
0.500   4.977   0.32899E-02 1.439701445411046415e-02
0.200   6.977   0.15972E-01 6.094966468334198084e-03
0.700   4.977   0.30631E-01 -5.640445453166963163e-03

out.txt

>   >   >
0.000   5.064   -0.15835E-01 -7.755619582136471027e-03 199.99224438041787
0.700   9.064   -0.21715E-02 -1.302134466433525067e-02 199.98697865533566
0.800   5.064   0.18954E-01 -1.691809184964498253e-02  199.98308190815035
>   >   >
0.500   4.977   0.32899E-02 1.439701445411046415e-02   200.01439701445412
0.200   6.977   0.15972E-01 6.094966468334198084e-03   200.00609496646834
0.700   4.977   0.30631E-01 -5.640445453166963163e-03  199.99435955454683

我试过了:

import numpy as np
data=np.loadtxt('input.txt')
data1=data(:,3)+200

我收到错误ValueError: could not convert string to float: '>' 我希望有专家能帮助我克服这个问题。

【问题讨论】:

    标签: python pandas numpy for-loop


    【解决方案1】:

    文件中有非数字符号。您可以将它们视为 cmets:

    data = np.loadtxt('input.txt', comments=">")
    

    但是您将无法将它们保存在输出文件中。恐怕您唯一的选择是在循环中逐行读取文件:

    CHANGE = 200
    with open('input.txt') as infile, open('out.txt', 'w') as outfile:
        for line in infile:
            if not line.startswith('>'): # Needs a modification
                parts = line.split()
                parts.append(str(float(parts[3]) + CHANGE) + '\n')
                line = ' '.join(parts)
            outfile.write(line)
    

    【讨论】:

    • 嗨@DYZ我想在输出文件中看到最后一列我的意思是必须有原始文件加上一个额外的输出文件列......所以在输出文件中必须有是 5 列而不是 4 列...请建议
    • 不是您在原始帖子中要求的内容。但是,新文件 out.txt 有五列。只需将其重命名为 input.txt。
    【解决方案2】:

    我不太明白这个问题,但我想我知道问题出在哪里。我可以通过以下几种方式帮助您:

    • 删除文件开头的>s。
    • 跳过>s。像这样:
    with open("input.txt", "r") as f:
        with open("temporaryfile.txt", "w") as temp:
            temp.write(f.read().replace(">   >   >",""))
        
        
    data=np.loadtxt("temporaryfile.txt")
    data1=data(:,3)+200
    

    之后只需使用import os;os.remove("temporaryfile.txt") 删除temporaryfile.txt

    问题是它遇到了>s,这就是导致错误的原因。所以,如果你删除这些,那应该可以解决你的问题。

    【讨论】:

    • 我需要附加添加并将其保存到文件中....请建议如何做到这一点
    • 按照答案中的建议,以编程方式删除>,然后您可以轻松地将数据读入熊猫数据框。稍后创建一个新列,将 200 添加到最后一列...然后将其保存为 text/csv 文件。
    • 请注意,根据 OP,"> > >" 东西必须保留在输出文件中。
    • @Priya 你能建议一个解决方案吗....
    【解决方案3】:

    我们可以在不创建新文件的情况下实现这一点,并使用 fileinput 库就地执行操作。在打击代码中,它也保留了这个“>”字符。

    import sys
    import fileinput
    
    file = fileinput.input('test.txt', inplace=1)
    
    for i, line in enumerate(file):
        if line.startswith('>'):
            sys.stdout.write(line)
        else:
            string = line.split()
            string.append('200\n')
            line = ' '.join(string)
            sys.stdout.write(line)
    file.close()
    

    以上代码的输出:

    >   >   >
    0.700 4.977 0.30631E-01 -5.640445453166963163e-03 200
    0.700 4.977 0.30631E-01 -5.640445453166963163e-03 200
    0.700 4.977 0.30631E-01 -5.640445453166963163e-03 200
    >   >   >
    0.700 4.977 0.30631E-01 -5.640445453166963163e-03 200
    0.700 4.977 0.30631E-01 -5.640445453166963163e-03 200
    0.700 4.977 0.30631E-01 -5.640445453166963163e-03 200
    

    【讨论】:

    • 谢谢@sdpshaw ...但是我想对test.txt的最后一列进行傅立叶变换之类的操作,并希望将结果附加到最后一列而不是200。可以吗有可能...请提出解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多