【问题标题】:Read .csv file with nested for loops, only getting last line读取带有嵌套 for 循环的 .csv 文件,仅获取最后一行
【发布时间】:2013-02-22 08:43:04
【问题描述】:

我正在尝试读取 .csv 文件并创建浮点值的二维数组。这是我到目前为止所做的:

import csv
filename  = 'data_out.csv'   
# create an array for the for the data    
row_values = [None]*len(header)   
all_values = []

reader = csv.reader(open(filename,'rt'),delimiter=',')
next(reader) #skip header line
for row in reader:
    i=0
    for item in row:
        value = float(item)
        row_values[i]=value
        i=i+1
        print(row_values)
    all_values.append(row_values)

print(all_values)

打印 (row_values) 看起来可以正常工作。每行都放入一个浮点值列表中。但是当我打印(all_values)时,它不起作用。我创建了一个列表列表(正确的行数),但它只是一遍又一遍地重复的最后一行值。也许我的 .append() 在错误的位置?

我应该说这是我第一次用 python 编程,但我已经用 C++ 编程多年了。任何帮助/提示将不胜感激。谢谢!

【问题讨论】:

  • 缩进有严重问题。要么你在这里发帖时把它丢了,要么你不明白 python 使用缩进来控制流。
  • 对不起,我应该说。它是 Python 3.3 版
  • 我在这里发帖时不知道如何格式化代码,但我的代码中有缩进。
  • 只需为缩进添加空格,通常每级 2 个空格(空格)。
  • 不,我一直在添加空格,但看起来还是一样。

标签: python csv for-loop


【解决方案1】:

问题在于,all_values 每次添加数组时都会为数组row_values 存储一个引用不是副本。因此,all_values 的所有元素都是指向同一个数组的引用,您将在每次迭代中覆盖 row_values 中的值。

看这个,例如:

b = []

a = [1, 2]
b.append(a)
print b

a[0] = 3
b.append(a)
print b

print id(b[0]), id(b[1])

这和你的程序效果一样,它会为第二个print 语句打印[[3, 2], [3, 2]]。最后的print语句显示了b中两个值的id,相同,表示b中的两个元素是同一个元素。

因此,您的循环的固定(和更 Python 的)版本将是:

reader = csv.reader(open(filename,'rt'),delimiter=',')
for row in reader:
    row_values = [float(item) for item in row]
    all_values.append(row_values)

print all_values

第三行使用列表推导将 row 中的所有值转换为浮点数并将它们存储在 new 数组中,然后将其附加到 all_values

【讨论】:

  • 如果你不喜欢列表推导式,你可以使用语法“for i, item in enumerate(row):”来自动获取索引:)
  • @MichaelClerx:没错,这将是一种更 Pythonic 的方法。尽管如此,这并没有解决数组重用的问题。
  • 绝对!只是添加到你的答案:)
  • @user2098583 如果它解决了您的问题,您可以接受答案:)
【解决方案2】:

您只需创建一个数组对象并将相同的数组对象附加到列表中。所以只有最后一行在最终输出中重复。

您应该在第一级循环内创建数组对象并将其附加到列表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多