【问题标题】:Typeerror occours when I tried to get a graphic from CSV file in python当我尝试从 python 中的 CSV 文件中获取图形时发生类型错误
【发布时间】:2018-09-12 09:09:43
【问题描述】:
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

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

【问题讨论】:

  • 我的意思是如果我只导入10或100个文件,结果和图形显示在python中,但是如果我打开10000个文件,就会出现这样的错误,我对此很困惑......
  • 问题是您在列表list_temp2 上使用操作float 并尝试将列表中的所有元素一次转换为浮动。你不能那样做。 float 需要一个标量参数。您需要一次将列表中的每个元素转换为浮动一个。您可以使用 y = [float(i) for i in list_temp2] 之类的列表理解
  • @Bazingaa 谢谢你的建议!!我试过了,似乎旧问题已经解决,但现在又出现了一个新问题……就像: File "C:\ProgramData\Anaconda3\lib\site-packages\matplotlib\cbook_init_.py", line 2357, in safe_first_element raise RuntimeError("matplotlib does not support generators " RuntimeError: matplotlib does not support generators as input
  • 我不知道你代码中的哪一行是这个错误来自
  • 我可以提一下,如果您发布完全未更改的代码并已被 SO 用户 (stackoverflow.com/q/52223419/8300135) 优化过,这没有帮助吗?我认为 Sam Mason 做了一个很好的审查工作,并准确地给了你想要实现的目标,但结构化并使用了 python 提供的适当工具。如果您已经处理了该提案并在此处发布了一个新版本,那么没有人会因为已经解决的问题而浪费时间思考如何优化您的程序。如果您使用干净的代码,您是否确定您在此处发布的错误仍然会出现...?

标签: python python-3.x matplotlib graphics


【解决方案1】:

此错误代码是由于尝试将 numpy 数组转换为长度大于 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-files 的列表,您是否看过python 的glob-module?它也可以搜索子目录...
  2. 您遍历文件进行读取,再次写入不包含“日期”的行,然后再次读取它...?太多了,IIUC。难道你不能只使用最后一个循环并将你的 list_temp-stuff 放在一个条件中,以测试“包含'日期'”吗?
  3. 你为什么在最后plt.show()之前fig = pyplot.figure(figsize=(10,10))?这应该会导致一个未使用的空图。
  4. headerremover.py 结合你的循环和if 'Date' not in row 看起来如果有很多标题行,也在中间,在你的文件中 - 这是真的吗?因为如果你只是在每个文件的顶部有一个包含 n 行的标题部分,那么还有更简单的方法可以跳过这些行......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多