csv Python:变量在每次迭代后未重新初始化[duplicate]

4ioopgfo  于 2022-12-06  发布在  Python
关注(0)|答案(2)|浏览(114)

此问题在此处已有答案

"Least Astonishment" and the Mutable Default Argument(32个答案)
16天前关闭。
我正在学习Python中的数据处理,尝试处理10月的每一天的天气数据。数据来自本地csv。我对一个月中的每一天进行迭代,并对其中的每一小时进行迭代。我有一个类对象来处理每一天的数据。类对象在每一天的迭代后立即进行初始化。问题是,这个对象不会在每次迭代后重新初始化。我在它下面做了一些测试对象。测试对象和对象之间的区别是,这个对象是一个子文件夹中的对象,它包含了我所有的数据处理.这个对象包含了一个数据容器类对象的列表,它们的源文件位于同一目录中。
--主类别--
`

import os 
import csv
from Data.VejrData import *

#Test class
class Ekstra:
    streng: str = ""

class Vejr: 
    currentDirectory: str = os.getcwd()
    dataDirectory: str = 'Data/vejrdata/'
    folder = os.listdir(currentDirectory+"/"+dataDirectory)
    days: list[VejrData] = []
    
    def __init__(self):
        self.main()
    
    def fetchData(self): 
        for file in self.folder:
            vejrData = VejrData()
            #Error!

            #For each file vejrData should be reset, but doesn't
            #For each file(31 iterations), all rows from the 32 iterations are being added(25 each * 31 = 248000 sets of data) 
            
            #Testing
            string = ""
            string += "New day"
            print(string)

            #Testing if the same happens with an empty class object. 
            ekstra = Ekstra()
            ekstra.streng += "New day"
            print(ekstra.streng)
            #This variable from class object does get reset. 
            #VejrData doesn't. 
            
            #Opens datafile from a specifik date. 
            with open(f"{self.dataDirectory}{file}", 'r') as data:      
                csvreader = csv.reader(data)
                number = 0 
                for row in csvreader: 
                    number += 1
                    index: int = 0 
                    
                    #iterates each element of data in a string. 
                    for textData in row[0].split(";"):
                        vejrData.constructData(index, textData) 
                        index += 1
            self.days.append(vejrData)

    def main(self): 
        self.fetchData()
        print(len(self.days))
        
        for day in self.days: 
            print(len(day.timeData))
    
vejr = Vejr()

'从主函数打印结果:len(self.days)= 32每天每小时数据集的长度= 775(对于所有32天)。775/25(24 + 1标题)= 31
--数据处理--'

from .TimeData import TimeData
#https://docs.python.org/3/tutorial/modules.html#intra-package-references

class VejrData: 
    #Lists containing hourly data 
    timeData: list[TimeData] = []
    #Variable retrieving data before being added to list. 
    DataBuilder: None

    #Distributing data from index: index 0 = time data, index 1 = prec data ... 
    def constructData(self,index: int, data): 
        #https://www.freecodecamp.org/news/python-switch-statement-switch-case-example/
        match index:   
            case 0: 
                self.DataBuilder = TimeData()
                self.DataBuilder.tid = data
            case 1: 
                self.DataBuilder.prec = data
            case 2: 
                self.DataBuilder.metp = data
            case 3: 
                self.DataBuilder.megrtp = data
            case 4: 
                self.DataBuilder.mesotp10 = data
            case 5: 
                self.DataBuilder.meanwv = data
                self.timeData.append(self.DataBuilder)
                self.DataBuilder = None

            case _:
                print(f"Error - Index not at index: {index}, is out of range.")

`
--容器类--'

class TimeData: 
    tid: int
    prec: float
    metp: float 
    megrtp: float 
    mesotp10: float
    meanwv: float

`
结构如下:/Vejr.py,/Data/VejrData & /Data/TimeData。没有发生与路径相关的错误。我可以在每个循环的末尾给予它一个新变量,但这似乎是错误的,因为这是在做循环应该做的事情。
我试过测试重新初始化是否不打算在for循环中发生。我创建了一些对象来看看它们是否会受到它的影响。我从字符串变量开始。当字符串变量被重新初始化时,我试着用同一文件中的另一个类对象,改变它内部的一个变量,看到它也重新初始化了。
因此,变量和类对象在每次迭代中都要重新初始化。

93ze6v8z

93ze6v8z1#

......在每次迭代中都要重新初始化
timeData是一个类属性,因为它有一个可变的默认值,VejrData的每个示例都将 * 指向 * 完全相同的列表。

>>> v = VejrData() 
>>> w = VejrData()
>>> v.timeData.append('x')
>>> v.timeData
['x']
>>> w.timeData       
['x']
>>> v.timeData is w.timeData
True
>>>

使timeData成为示例属性。
第一次

jc3wubiy

jc3wubiy2#

感谢您对我的问题的快速回复。我确实遇到了可变默认值。在将初始值设置为none并在稍后添加它之后,我创建了32个唯一的数据集,而不是一个。

相关问题