【问题标题】:How to multiply one column by another in a csv file and re-write如何将csv文件中的一列乘以另一列并重写
【发布时间】:2013-10-04 17:49:35
【问题描述】:

我有一些 csv 格式的数据,我需要将第 3 列乘以第 6 列并将结果附加到末尾。我的数据如下:

 TITLE,TITLE,T,T,T,T
 data,data,5,data,data,98.7,data
 data,data,2,data,data,97,data
 data,data,5,data,data,98,data
 data,data,4,data,data,8.7,data
 data,data,5,data,data,9.7,data
 data,data,12.5,data,data,198.7,data

我对编码真的很陌生,但我的尝试如下: 导入 csv 导入日期时间 导入副本 从集合导入默认字典

class_col = 2
data_col = 5

with open('minitest.csv', 'r') as f:
    data = [line.strip().split(',') for line in f]

for row in data:
    class_col*data_col

with open('minitest_edit.csv', 'w') as nf:
    nf.write('\n'.join(','.join(row) for row in data))

print "done"

我没有收到任何错误,有什么建议吗?感谢操作系统”

【问题讨论】:

  • 你应该接受一个答案——有很多好的答案。

标签: python csv python-2.7 multiplication


【解决方案1】:

使用csv.reader 和csv.writer:

import csv


with open('minitest.csv', 'rb') as f:
    reader = csv.reader(f)
    data = [next(reader)]  # title row
    for row in reader:
        data.append(row + [float(row[2]) * float(row[5])])

with open('minitest.csv', 'wb') as nf:
    writer = csv.writer(nf)
    writer.writerows(data)

产生:

TITLE,TITLE,T,T,T,T
data,data,5,data,data,98.7,data,493.5
data,data,2,data,data,97,data,194.0
data,data,5,data,data,98,data,490.0
data,data,4,data,data,8.7,data,34.8
data,data,5,data,data,9.7,data,48.5
data,data,12.5,data,data,198.7,data,2483.75

【讨论】:

  • CSV 文件应使用rb 和wb 打开和写入。此外,可以通过在与读取相同的循环中进行写入来提高代码的效率——这样您就不必读取内存中的所有内容。如果问题是您无法写入正在阅读的文件,您可以使用tempfile 和mv。
【解决方案2】:

您希望以下内容将您的列相乘并将它们附加到原始列:

new_data = []
for row in data:
    new_data.append(row + [float(row[class_col]) * float(row[data_col])])

【讨论】:

  • 如果row 是一个列表,我认为是,你的代码会在运行时抛出一个TypeError;此外,使用列表推导而不是 for 循环将是惯用的。
  • @ErikAllik 更正了列表连接错误并将字符串转换为float
【解决方案3】:

这是一种更有效的方法,即不读取内存中的数据,这对于更大的数据集很重要:

import csv
import tempfile
import shutil

input_file = 'minitest.csv'

with open(input_file, 'rb') as f, \
     tempfile.NamedTemporaryFile(delete=False) as out_f:

    # in order to be able to not have to read everything in memory, we have to 
    # write every processed row to disk immediatley; for that, we need a temporary
    # file because we can't read and write a single file at the same time:
    reader = csv.reader(f)
    writer = csv.writer(out_f)

    # header row
    writer.writerow(next(reader))

    # note that this uses a generator not a list, so that writerows will lazily
    # evaluate each row as it writes them to disk
    writer.writerows(row + [float(row[2]) * float(row[5])] for row in reader)

# one everything's done, overwrite the original file with the new contents.
shutil.move(out_f.name, input_file)

P.S.如果你不写回同一个文件实际上会更简单——你总是可以在处理代码完成后手动移动,以保持处理代码更简单。

【讨论】:

  • 接受了这个答案,因为我真的很感激人们放 cmets :)
  • @OliverSteph:顺便说一句,我刚刚修复了代码中的一些小错误。
【解决方案4】:

如果你幸运并且在 LUNIX 上编程,你可以使用 awk:

awk -F "\"*,\"*" '{print $0 "," $3*$6 }' test.csv > result.csv

你可以用 Python 调用它http://docs.python.org/2/library/subprocess.html。

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多