【问题标题】:Python append column header & append column values from list to csvPython追加列标题并将列值从列表追加到csv
【发布时间】:2017-02-06 21:21:31
【问题描述】:

我正在尝试附加列标题(硬编码)并将列值从列表附加到现有的 csv。我没有得到想要的结果。

方法 1 是在现有 csv 文件上附加结果。方法 2 将现有 csv 的副本克隆到 temp.csv 中。这两种方法都没有得到我想要的输出。在结果 1 中,它只是附加在最后一行单元格之后。在结果 2 中,所有列表值都附加在每一行上。预期的结果是我正在寻找的。

我在下面包含了我的代码。感谢任何输入或指导。

现有的 CSV Test.csv

Type,Id,TypeId,CalcValues
B,111K,111Kequity(long) 111K,116.211768
C,111N,B(long) 111N,0.106559957
B,111J,c(long) 111J,20.061634

代码 - 方法 1 和 2

final_results = ['0.1065599566767107', '0.0038113334533441123', '20.061623176440904']

# Method1
csvfile = "test.csv"
with open(csvfile, "a") as output:
    writer = csv.writer(output, lineterminator='\n')
    for val in final_results:
        writer.writerow([val])  

# Method2
with open("test.csv", 'rb') as input, open('temp.csv', 'wb') as output:
    reader = csv.reader(input, delimiter = ',')
    writer = csv.writer(output, delimiter = ',')

    all = []
    row = next(reader)
    row.insert(5, 'Results')
    all.append(row)

    for row in reader:
        for i in final_results:
            print type(i)
            row.insert(5, i)
        all.append(row)
    writer.writerows(all)

方法 1 的结果

Type,Id,TypeId,CalcValues
B,111K,111Kequity(long) 111K,116.211768
C,111N,B(long) 111N,0.106559957
B,111J,c(long) 111J,20.0616340.1065599566767107
0.0038113334533441123
20.061623176440904

方法 2 的结果

Type,Id,TypeId,CalcValues,Results
B,111K,111Kequity(long) 111K,116.211768,0.1065599566767107,20.061623176440904,0.0038113334533441123
C,111N,B(long) 111N,0.106559957,0.1065599566767107,20.061623176440904,0.0038113334533441123
B,111J,c(long) 111J,20.061634,0.1065599566767107,20.061623176440904,0.0038113334533441123

预期结果

Type,Id,TypeId,CalcValues,ID
B,111K,111Kequity(long) 111K,116.211768,0.1065599566767107
C,111N,B(long) 111N,0.106559957,20.061623176440904
B,111J,c(long) 111J,20.061634,0.0038113334533441123

【问题讨论】:

  • 忘了提及,因为我仅限于使用 csv 阅读器或内置 python 库。谢谢。
  • 好问题,但值似乎错误:final_results 似乎与预期输入的顺序不同。并且Result 列已转向ID。可以编辑吗?

标签: python list loops csv parsing


【解决方案1】:

第一种方法肯定会失败:您不想添加新行而是添加新列。回到第二种方法:

您可以插入标题,但随后您将遍历每一行的结果,而您需要对其进行迭代。

为此,我从final_results 列表(使用__iter__())创建一个迭代器,然后我调用it.next 并附加到每一行(无需在最后插入,只需附加)

我删除了 all 大列表,因为 1) 你可以一次写一行,节省内存,以及 2) all 是一个预定义的函数。避免将其用作变量。

final_results = ['0.1065599566767107', '0.0038113334533441123', '20.061623176440904']

# Method2
with open("test.csv", 'rb') as input, open('temp.csv', 'wb') as output:
    reader = csv.reader(input, delimiter = ',')
    writer = csv.writer(output, delimiter = ',')


    row = next(reader)  # read title line
    row.append("Results")
    writer.writerow(row)  # write enhanced title line

    it = final_results.__iter__()  # create an iterator on the result

    for row in reader:
        if row:  # avoid empty lines that usually lurk undetected at the end of the files
            try:
                row.append(next(it))  # add a result to current row
            except StopIteration:
                row.append("N/A")     # not enough results: pad with N/A
            writer.writerow(row)

结果:

Type,Id,TypeId,CalcValues,Results
B,111K,111Kequity(long) 111K,116.211768,0.1065599566767107
C,111N,B(long) 111N,0.106559957,0.0038113334533441123
B,111J,c(long) 111J,20.061634,20.061623176440904

注意:如果我们将"Results" 包含在final_results 变量中,我们甚至不需要以不同的方式处理第一行。

注意2:值似乎错误:final_results 似乎与预期输出的顺序不同。而Result 列已变为ID,但这很容易纠正。

【讨论】:

  • 我得到停止迭代错误。我如何通过您的解决方案避免这种情况?
  • 我在我的代码中添加了针对最后一个空行的保护。问题是:如果您的结果列表小于行数,您会得到StopIterationError(迭代器中的值不足)。我也进行了编辑以防止这种情况发生。
  • 行 row.append("Results") 上仍然出现同样的错误
  • row.append("Results") 上不能有停止迭代异常。发布完整的堆栈跟踪。
  • 不客气。当你得到StopIteration 时,这是因为你到达了“列表”的末尾。打印next() 发出的值,你会看到发生了什么。
【解决方案2】:
import csv

HEADER = "Type,Id,TypeId,CalcValues,ID"
final_results = ['0.1065599566767107', '20.061623176440904', '0.0038113334533441123']

with open("test.csv") as inputs, open("tmp.csv", "wb") as outputs:
    reader = csv.reader(inputs, delimiter=",")
    writer = csv.writer(outputs, delimiter=",")

    reader.next()  # ignore header line
    writer.writerow(HEADER.split(","))  

    for row in reader:
        writer.writerow(row + [final_results.pop(0)])

我将header字段存入HEADER并切换final_results的第2个和第3个元素,使用pop(0)移除并返回final_results的第一个元素

输出:

Type,Id,TypeId,CalcValues,ID
B,111K,111Kequity(long) 111K,116.211768,0.1065599566767107
C,111N,B(long) 111N,0.106559957,20.061623176440904
B,111J,c(long) 111J,20.061634,0.0038113334533441123

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 2019-12-01
    • 2011-01-11
    • 1970-01-01
    • 2012-08-30
    • 2012-11-11
    • 2021-01-09
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多