Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中从文件中提取数据_Python_File - Fatal编程技术网

如何在python中从文件中提取数据

如何在python中从文件中提取数据,python,file,Python,File,如何在多行图中绘制这些数据 我尝试过使用这些代码,但只有每行的第一个值被添加到列表中 对于y轴,我希望得到设备的值乘以0.5,0,1,0的值(例如,对于第1行,(tv值=120),我应该得到24个位于 y轴:60和 x轴0 y轴0和 x轴1 y轴120和 x轴2 以此类推…总共有24个绘图(我的y标签将由0到2200的值组成) 对于我的x轴,我将绘制x_标签的值 文件格式 Residents: 4 TV1:120:0.5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,0,0

如何在多行图中绘制这些数据

我尝试过使用这些代码,但只有每行的第一个值被添加到列表中

对于y轴,我希望得到设备的值乘以0.5,0,1,0的值(例如,对于第1行,(tv值=120),我应该得到24个位于

y轴:60和 x轴0

y轴0和 x轴1

y轴120和 x轴2

以此类推…总共有24个绘图(我的y标签将由0到2200的值组成)

对于我的x轴,我将绘制x_标签的值

文件格式

Residents: 4
TV1:120:0.5,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0.5,0,0,0.5,1,1,1,0.5
Computer:320:1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Fridge1:250:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Dishwasher:500:0.5,1,1,0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1
Blender:700:0,0,0,0,0,0,0,0,0,0,0,0,0,0.05,0,0,0,0,0,0,0,0,0,0
Fridge2:50:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Coffee machine:2400:0,0,0,0,0,0,0,0,0,0.05,0.05,0,0,0,0,0,0,0,0,0,0,0,0,0
Kettle:2200:0.05,0,0,0,0,1,0,0,0.05,0,0.05,0.05,0,0,0,0,0.05,0,0,0,0,0.05,0.05,0
Freezer:140:1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
Slow cooker:300:0,0,0,0,0,0,0,0,0,0,0,0,0.5,1,1,1,1,1,0.5,0,0,0,0,0
我的代码

import matplotlib.pyplot as plt
import numpy as np

x = []
y = []

x_labels = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']

fileobj = open('file.csv','r')
for line in fileobj:
    line_s = line.strip()
    Usage = [(x) for x in line_s.split(',')]
    y.append(Usage[2])




fileobj.close()

plt.plot(y ,"o--")
plt.ylabel("usage")
plt.xlabel("time")
plt.show()

欢迎来到SO

让我们试试这个

fileobj = open('file.csv','r')
first_line = True

for line in fileobj:
    if first_line:
       first_line = False
       continue
    line_s = line.strip() # line -> Slow cooker:300:0,0,0,..
    name, id, values = line.split(':') # ['Slow cooker', '300', '0,0,0']
    usage = [int(x) for x in values.split(',')] # convert values into integers
    print(usage)
    y.append(usage)
我的理解是您正在尝试绘制此文本数据。Y是列表格式的使用值

如果您不确定发生了什么,请使用我在上述代码中添加的
print
命令

import matplotlib.pyplot as plt
import numpy as np

x_labels = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23']

with open(r'C:\Users\$env:UserName\Desktop\MyScripts\file.csv', 'r') as file_obj:
    for line in file_obj:
        line = line.strip('\n')
        # print(f"{line = }")
        usage = [x for x in line.split(',')]
        # print(f"{usage = }")
        number = float(usage[0].split(':')[1])
        first = [float(usage[0].split(':')[-1])]
        remaining = [float(x) for x in usage[1:]]
        # print(f"{first = }")
        # print(f"{type(first) = }")
        # print(f"{remaining = }")
        first.extend(remaining) # * number
        res = list(map(lambda x: x * number, first))
        print(f"{res = }")

plt.plot(res, "o--")
plt.ylabel("usage")
plt.xlabel("time")
plt.show()

读取文件时,您将获得每个设备x(时间)上的所有数据。 如果要打印所有设备,可以在读取数据时进行打印。看起来您希望设备作为标签

fileobj = open('file.csv','r')
line = fileobj.readline()
for i, line in enumerate(fileobj):
  device, wattage, h = line.split(':')
  watts = [float(x) * float(wattage) for x in h.replace('\n','').split(',')]
  # print(device, watts, wh)
  plt.plot(watts, label=str(i+1))
  # or plt.plot(watts, label=device) # if you want device as label

plt.legend()

你能再解释一下吗?你想把设备名称写在X轴上吗?比如说TV1在X=0,电脑在X=1(虽然0、1等不会出现)。那么多个y值呢?你想让它们相互连接吗(第一个电视条目用一条线连接到第一个电脑条目,依此类推)?每行是否保证有完全相同的条目数?@VBB我已更新问题…如果仍然不清楚,请告诉我是的,thnks我现在在不同的列表中有所有值,但我如何获取第一个值(例如:计算机:320:我如何获取值320),然后将其乘以列表中的值(例如:1,0,0),然后绘制图表。我想说的是,我的y值应该是列表中的第一个值(320)乘以其他值。你可以像
usage=[int(x)*int(id)for x in values.split(',')]
我现在所有的值都在不同的列表中,但是我如何取第一个值(例如:计算机:320:我如何取值320),然后将其与列表中的值相乘(例如:1,0,0),然后绘制图表。我想说的是,我的y标签应该是:2200 2000 1800 1600…像这样取出值:用法[0]。拆分(“:”)[1]你的代码工作得很好,但是你能向我解释一下,24小时的时间是如何出现在x轴上的吗?这只是隐式的——在没有给出相应的x数据的情况下,根据y数据的索引进行绘图。换句话说,
plt.plot(watts)
plt.plt(range(len(watts)),watts)
是一样的。