当我试图从python中的CSV文件中获取图形时,出现了Typeerror occours

2022-12-01 04:02:23 发布

您现在位置:Python中文网/ 问答频道 /正文

import os
from matplotlib import pyplot as pyplot
from collections import defaultdict
import csv
import numpy as np
path = r'C:\Users\AK6PRAKT\Desktop\6daten'
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

我真的不知道该怎么解决这个问题,如果有人能帮我,谢谢!!!!!!你知道吗


Tags: csvpathinimportfornamesasnpopenlistrowpyplotappendtemp2temp1
1条回答
网友
1楼 · 发布于 2022-12-01 04:02:23

此错误代码是由于试图将长度大于1的numpy数组强制转换为float而导致的:

示例:

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. 你反复读一个文件,又一次不写包含“日期”的行,然后你又读了一遍。。。?太过分了,伊鲁克。你就不能用最后一个循环,把你的列表放在一个条件中,哪个测试“包含‘日期’”?你知道吗
  3. 为什么你在结尾的fig = pyplot.figure(figsize=(10,10))之前plt.show()?这将导致一个未使用的空数字。你知道吗
  4. headerremover.py与循环和if 'Date' not in row结合起来看,如果文件中有许多头行,也在中间,那么这是真的吗?因为如果在每个文件的顶部有一个包含n行的头段,那么还有更简单的方法来跳过这些行。。。你知道吗