当我尝试从 python 中的 CSV 文件中获取图形时出现类型错误


import os
from matplotlib import pyplot as pyplot
from collections import defaultdict
import csv
import numpy as np
path = r'C:UsersAK6PRAKTDesktop6daten'
dirs = os.listdir(path) 
s = []
x = []
y = []
names = []
fig = pyplot.figure()
for i in dirs:                             
if os.path.splitext(i)[1] == ".csv": 
f = open(path+"/"+i)
iter_f = iter(f);
str = ""
for line in iter_f: 
str = str + line
s.append(str) 
with open(path+"/"+i,'r') as r:
lines=r.readlines()
with open(path+"/"+i,'w') as w:
for row in lines:
if 'Date' not in row:
w.write(row)
columns = defaultdict(list)
with open(path+"/"+i) as f:
reader = csv.reader(f)
for row in reader:
for (i,v) in enumerate(row):
columns[i].append(v)
list_temp1 = columns[0]
list_temp1 = np.array(list_temp1)
list_temp2 = columns[2]
list_temp2 = np.array(list_temp2)
print(list_temp1,list_temp2)
y.append(float(list_temp2))                                                    
names.append(list_temp1)
x = range(len(names))
pyplot.ylim((0, 40)) 
my_y_ticks = np.arange(0, 40, 10)
pyplot.plot(x,y, linewidth=2)
pyplot.xticks(x,names,rotation = 90)
fig = pyplot.figure(figsize=(10,10))
pyplot.show()

如果只有几个 csv 文件,则此代码效果非常好。但是我想在实践中应用这段代码,我需要分析超过 200000 个 csv 文件并制作一个图形,以便我可以清楚地看到这些数据的波动,但是当我想导入这些宏伟的文件时,会出现以下错误:

File "C:/Users/AK6PRAKT/headerremover.py", line 44, in <module>
y.append(float(list_temp2))
TypeError: only size-1 arrays can be converted to Python scalars

我真的不知道解决这个问题,如果有人可以帮助我,非常感谢!!!!!

此错误代码是由于尝试将 numpy 数组转换为 float,其长度> 1:

例:

float(np.array([3,2,1]))
Traceback (most recent call last):
File "<ipython-input-22-e396216bb2ea>", line 1, in <module>
float(np.array([3,2,1]))
TypeError: only length-1 arrays can be converted to Python scalars

但:

float(np.array([3]))
: 3.0

所以这个错误发生在你的行中(44,引用错误消息(

y.append(float(list_temp2))

如果list_temp2有多个条目。因此,它应该与您处理的文件数量无关。

然而:

就像 Georgy 已经提到的 - 假设你的代码比任务需要的要复杂一些。
这里只是我的一些想法...

  1. 如果你需要一个目录中所有csv文件的列表,你有没有看过Python的glob-模块?它也能够搜索子目录...
  2. 您遍历一个文件以进行读取,再次用于在没有包含"日期"的行的情况下进行写入,然后再次读取它......?这太过分了,IIUC。您不能只使用最后一个循环并将您的list_temp东西放在一个条件中,以测试"包含'日期'"吗?
  3. 你为什么在最后plt.show()之前fig = pyplot.figure(figsize=(10,10))?这应该会导致未使用的空数字。
  4. headerremover.py与您的循环相结合,if 'Date' not in row看起来您的文件中也有很多标题行,也在中间 - 这是真的吗?因为如果你只是在每个文件的顶部有一个 n 行的标题部分,那么又会有更简单的方法跳过这些行......

最新更新