首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在python中的CSV文件中添加两行

在python中的CSV文件中添加两行
EN

Stack Overflow用户
提问于 2018-07-28 06:46:25
回答 2查看 1K关注 0票数 -1

我有一个有几千行和4-64行的csv文件(我有大约50个CSV文件,每个文件的列数可能不同,但每个文件都有固定的列数)。e.g

代码语言:javascript
复制
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,原始文件中的第3行将为28,第4行将为1,因此,新文件中的第2行将为28+1 = 29

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-28 07:06:04

首先加载数据:

代码语言:javascript
复制
import csv

with open("path/to/file.csv", "r") as f:
    reader = csv.reader(f)
    rows = [float(row) for row in reader]

现在需要成对处理行,所以在列表上迭代一个普通的for循环不会有太大帮助。

代码语言:javascript
复制
summed_rows = []
for i in range(0, len(rows), 2):
    first_row_sum = sum(rows[i])
    second_row_sum = sum(rows[i + 1])
    both_rows_sum = first_row_sum + second_row_sum
    summed_rows.append((both_rows_sum,)) # Each row must be iterable

(假设行数为偶数。如果行数为奇数,second_row_sum的计算将在最后失败。)

for循环执行之后,您的summed_rows应该是您需要的输出,您只需要将它写入一个文件。

代码语言:javascript
复制
with open("path/to/output.csv", "w") as output:
    writer = csv.writer(output)
    for row in summed_rows:
        writer.writerow((row,))
票数 0
EN

Stack Overflow用户

发布于 2018-07-28 06:55:51

如果我理解您的问题,那么在stdlib的帮助下,您想要做的事情非常简单。

首先,打开文件:

代码语言:javascript
复制
with open(path) as f:

然后附加一个csv.reader,这会将它从行的可迭代转换为行列表的可迭代:

代码语言:javascript
复制
    rows = csv.reader(f, delimiter=' ')

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

代码语言:javascript
复制
    rows = (map(float, row) for row in rows)

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

代码语言:javascript
复制
    it1, it2 = itertools.tee(rows)
    next(it2)
    pairs = zip(it1, it2)

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

代码语言:javascript
复制
    for xrow, yrow in pairs:

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

代码语言:javascript
复制
        diffs = (x - y for x, y in zip(xrow, yrow))
        sumsquares = sum(diff*diff for diff in diffs)
        print(sumsquares**0.5)

这将打印出来:

代码语言:javascript
复制
0.0
11.832159566199232
11.269427669584644

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51566436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档