【问题标题】:Python 2.7 - Edit Specific Row,Column in CSVPython 2.7 - 在 CSV 中编辑特定的行、列
【发布时间】:2016-10-24 18:19:02
【问题描述】:

我有一个包含一堆数据的 CSV,我需要更改特定行和列中的数据。我能够通读文件,找到我需要更改的行、列、更改数据,但我不知道如何将更改提交到内存并正确重写 CSV。

以下代码没有失败,但它不正确。它没有提交我对列 (col) 所做的更改,而是复制了我想要更改的行。数据没有改变,现在我只是在我想要更改的地方有重复的行。

import csv
import re
from tempfile import NamedTemporaryFile
import shutil

csvName = raw_input("Enter the filename: ")
tempfile = NamedTemporaryFile(delete=False)
newSize = 0
newArea = 0

with open(csvName, 'rb') as readCSV, tempfile:
    reader = csv.reader(readCSV)
    writer = csv.writer(tempfile)
    for row in reader:
        for col in row:
            if col.startswith('Connection:'):
                print col
            if col.startswith('Size:'):
                print "Current", col
                newSize = raw_input("Enter new size: ")
                newArea = int(newSize)*int(newSize)
                col = re.sub('[0-9]+', newSize, col)
                writer.writerow(row)
            if col.startswith('Area:'):
                col = re.sub('[0-9]+', str(newArea), col)
                writer.writerow(row)
        writer.writerow(row)

shutil.move(tempfile.name, csvName)

这是需要更改的一位数据的示例:

连接:D14Conn 类型:B2B 尺寸:140 几何形状:方形 面积:19600

我上面的代码将简单地将新行复制到此数据中,并且我对 col 所做的更改未提交 - 如下所示

连接:D14Conn 类型:B2B 尺寸:140 尺寸:140 几何形状:方形 面积:19600 面积:19600

【问题讨论】:

    标签: python csv


    【解决方案1】:

    当您分配给 col 时,您正在分配给行中 col 值的副本。当您遍历row 时,您需要保持对要更改的值的索引的引用,并在该索引处更新row,这样当您调用writer.writerow(row) 时,您实际上是在使用已更改的对象进行编写,或使用所需的列创建 new_row。 至于您的重复项,请从您的 if 块中删除 writer.writerow(row) 调用,它们是多余的。

    【讨论】:

    • 我认为这是我需要做的。所以,我只需要跟踪我迭代到的行号,然后我迭代到的列号,然后更改该行/列的值,对吗?
    • reader 是一个可迭代对象,因此您不一定会从跟踪行号中受益,但您不需要这样做,因为每个 row 将只是一个值数组。因此,如果您正在查看的行中的第 3 列应该更新,只需说 row[2]= ___,然后您的 writer.writerow(row) 将反映更新
    • 所以我明白你的回答,但现在我在执行时遇到了麻烦。 csvReader 似乎没有以 Row:Column 格式跟踪 csv。当我在跟踪迭代的同时尝试以下代码时,我最终会遇到“列表索引超出范围”错误,我认为这是因为我尝试引用列号:
    • 行[rowNum][colNum] = re.sub('[0-9]+', newSize, col)
    • 没问题老兄!复习 Python 中的迭代器对象。它们没有被索引,它们只是实现 __iter__() 和 next() 函数,可以在带有in 的语句中使用,例如你的for row in reader
    【解决方案2】:

    您的row 没有更改。您需要使用新列值创建 new_row 并执行 writer.writerow(new_row)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 2018-01-08
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      • 2016-07-29
      • 2014-05-09
      相关资源
      最近更新 更多