从 CSV 文件读取数据会产生 TypeError

Reading data from a CSV file yields TypeError

我有一个 csv 文件,其中存储了以下数据 uncov_users.csv:2867,2978

我正在尝试从 CSV 文件中获取数据并进行打印,但出现错误。我需要单独变量中的数据,所以我使用 for i,j 循环。

我的代码:

import numpy as np
uncov_users = np.genfromtxt('ucov_users.csv', delimiter=',')
for i,j in uncov_users:
    ux_coor = i  
    uy_coor = j  
    print(ux_coor,uy_coor)

错误:

Traceback (most recent call last):
  File "D:\Programmes\Final_Year\Plot_DFO\test.py", line 3, in <module>
    for i, j in uncov_users:
TypeError: cannot unpack non-iterable numpy.float64 object

我只是想了解它出了什么问题以及如何解决。

使用pandas。您可以将 csv 放入数据框中,然后将列转换为 numpy 数组:

import pandas
import numpy as np

dataframe = pandas.read_csv('ucov_users.csv', delimiter=',')
ux_coord = np.array(dataframe.iloc[:, 0])
uy_coord = np.array(dataframe.iloc[:, 1])

您的 uncov_users 变量形状错误。对于循环

for i,j in uncov_users:
   # stuff ...

要工作,uncov_users 需要是一个有两列的二维数组,这样 i 可以从第一列分配一个值,j 从第一列分配一个值第二列。

如果您像这样重写 for 循环,这个问题会更容易发现:

for row in uncov_users:
   i,j = row
   # stuff ...

对于您拥有的uncov_users数组,row只是一个数字(或者更准确地说,是一个numpy.float64对象),所以它不能解包。它没有可以分配给变量 ij.

的两个组件

可能解决此问题的最简单方法是使用 numpy.atleast_2d() 函数,例如

uncov_users = np.atleast_2d(np.genfromtxt('ucov_users.csv', delimiter=','))

这样,如果文件 ucov_users.csv 只有一行两列,数组 uncov_users 仍将有两列,而不是包含两个元素的一维数组。 (当然,这假设 ucov_users.csv 总是有两列。)

试试这个:

import numpy as np

text = open("ucov_users.csv", "r")
text = ''.join([i for i in text]) \
    .replace(" ", "\n")
x = open("ucov_users.csv", "w")
x.writelines(text)
x.close()


uncov_users = np.genfromtxt('ucov_users.csv', delimiter=',')
for i,j in uncov_users:
    ux_coor = i  
    uy_coor = j  
    print(ux_coor,uy_coor)