1

我在文本文件中有数据,我希望能够按列修改文件并再次输出文件。我通常用 C(基本能力)编写,但选择 python 是因为它明显的字符串好处。我以前从未使用过python,所以我有点卡住了。我一直在阅读类似的问题,但它们只展示了如何更改整行。老实说,我知道该怎么做。

说我有文件

1 2 3
4 5 6
7 8 9

我希望能够用一些函数改变第二列,比如将它乘以 2,所以我得到

1 4 3
4 10 6
7 16 9

理想情况下,我将能够轻松更改程序,以便将任何功能应用于任何列。

对于任何有兴趣的人来说,它是用于修改实验室数据以进行绘图。例如,记录第一列的日志。

4

4 回答 4

1

我会使用pandas或只是 numpy。阅读您的文件:

data = pd.read_csv('file.txt', header=None, delim_whitespace=True)

然后使用类似样式的电子表格中的数据,例如:

data.values[:,1] *= 2

最后再次写入文件:

data.to_csv('output.txt')
于 2013-05-16T12:47:25.997 回答
1

Here is a very simple Python solution:

for line in open("myfile.txt"):
    col = line.strip().split(' ')
    print col[0],int(col[1])*2,col[2]

There are plenty of improvements that could made but I'll leave that as an exercise for you.

于 2013-05-16T12:31:09.567 回答
1

Python 是一种优秀的通用语言,但是我可能会建议,如果您使用的是基于 Unix 的系统,那么也许您应该看看 awk。语言 awk 是为这种基于文本的转换而设计的。您的问题很容易看出 awk 的力量,因为解决方案只有几个字符: awk '{$2=$2*2;print}'.

$ cat file
1 2 3
4 5 6
7 8 9

$ awk '{$2=$2*2;print}' file
1 4 3
4 10 6
7 16 9

# Multiple the third column by 10
$ awk '{$3=$3*10;print}' file
1 2 30
4 5 60
7 8 90

awk每列中由$iii字段引用。所以我们只需将第二个字段的值设置为第二个字段的值乘以 2 并打印该行。这可以写得更简洁,awk '{$2=$2*2}1' file但最好在一开始就清楚。

于 2013-05-16T12:14:11.560 回答
0

正如@sudo_O 所说,对于这项任务,有比 python 更有效的工具。但是,这是一个可能的解决方案:

from itertools import imap, repeat
import csv

fun = pow

with open('m.in', 'r') as input_file :
    with open('m.out', 'wb') as out_file:

        inpt = csv.reader(input_file, delimiter=' ')
        out = csv.writer(out_file, delimiter=' ')

        for row in inpt:
            row = [ int(e) for e in row] #conversion
            opt = repeat(2, len(row) ) # square power for every value

                    # write ( function(data, argument) )
            out.writerow( [ str(elem )for elem in imap(fun, row , opt ) ]  )

在这里,它将每个数字自己相乘,但您可以通过更改 opt 将其配置为仅乘以第二列:opt = [ 1 + (col == 1) for col in range(len(row)) ](2 代表 col 1,1 否则)

于 2013-05-16T12:30:57.663 回答