首页 > 解决方案 > 在python中的CSV文件中添加两行

问题描述

我有一个包含数千行和 4-64 列的 csv 文件(我有大约 50 个 CSV 文件,列数可能因文件而异,但每个文件都有固定的列数)。例如

0 0 0 0 0 0 0\n
0 0 0 0 0 0 0\n
1 2 3 4 5 6 7\n
0 0 0 0 0 0 1\n

所以,我需要先对每一行求和,然后使用一些数学方程将两个连续的行相加。最好的pythonic方法是什么?我可以在新文件中写入新值。因此,新文件的行数将少于原始文件,因为它合并了两行的值。例如,CSV1 在对不同列求和后,第 1 行中的值为 0,第 2 行为 0。因此,新文件第 1 行将是 0+0 = 0,原始文件中的第三行 = 28,第 4 行 =1 所以,第 2 行在新文件中 = 28+1 = 29

标签: pythonfile

解决方案


如果我理解您的问题,那么在 stdlib 的帮助下,您想要做的事情很容易。

首先,打开文件:

with open(path) as f:

然后附加 a csv.reader,将其从可迭代的行转换为可迭代的行列表:

    rows = csv.reader(f, delimiter=' ')

这些行中的每一行都是作为字符串的列列表。您显然需要将它们转换为intfloat其他东西来对它们进行数学运算:

    rows = (map(float, row) for row in rows)

现在您需要将其转换为可迭代的相邻行对。如果您查看docs中的Recipesitertools,就会发现有一个pairwise函数可以对任何可迭代对象执行此操作。但这很简单,只需手动执行:

    it1, it2 = itertools.tee(rows)
    next(it2)
    pairs = zip(it1, it2)

现在,pairs是成对的可迭代行。所以我们可以循环它:

    for xrow, yrow in pairs:

我不确定你想对这些行做什么。也许你想要,我不知道,列的差异平方的平方根?无论你想要什么都应该很容易:

        diffs = (x - y for x, y in zip(xrow, yrow))
        sumsquares = sum(diff*diff for diff in diffs)
        print(sumsquares**0.5)

这将打印出:

0.0
11.832159566199232
11.269427669584644

…我敢肯定这不是你想要的,因为你想做一些与我凭空挑选的数学不同的数学,但希望这显然是为什么这是结果,以及如何为你的使用相同的结构实际问题。


推荐阅读