gpt4 book ai didi

Python 试图从文件中写入和读取类,但出现了可怕的错误

转载 作者:太空宇宙 更新时间:2023-11-04 08:19:23 24 4
gpt4 key购买 nike

考虑到这只是我的家庭作业,我不希望得到太多帮助,但我就是想不通,老实说,我无法理解哪里出了问题。通常我知道问题出在哪里,但现在我就是不明白。

长话短说:我试图在一个类中创建一个看起来有效的电话号码,然后将其加载到数组或列表中,然后将它们全部作为字符串保存到一个文件夹中。当我再次启动程序时,我希望它读取文件并重新创建我的类并将其加载回列表中。 (基本上是一个非常简单的存储库)。

问题是即使我以完全相同的方式评估存储的电话号码,我将其验证为输入数据......我收到一个毫无意义的错误。

另一个小问题是,当我出于某种原因重新使用数据时,它会在文件中创建空白,这反过来又会严重破坏我的程序。

我在这里验证电话号码:

def validateTel(call_ID):
if isinstance (call_ID, str) == True:
call_ID = call_ID.replace (" ", "")
if (len (call_ID) != 10):
print ("Telephone numbers are 10 digits long")
return False
for item in call_ID:
try:
int(item)
except:
print ("Telephone numbers should contain non-negative digits")
return False
else:
if (int(item) < 0):
print ("Digits are non-negative")

在此之后,我使用它和其他不相关的(与本次讨论相关的)数据来创建一个对象(类实例)并将它们移动到一个列表中。

在我的类里面,我有一个来自字符串的负载和一个到字符串的负载。他们所做的是从我的类对象中获取所有内容,这样我就可以使用 "+" 作为分隔符将其写入文件,这样我就可以使用 string.split("+") 并将其写入文件。这很好用,但是当我读到它时……好吧,它不起作用。

    def load_data():
f = open ("data.txt", "r")
ch = f.read()
contact = agenda.contact () # class object
if ch in (""," ","None"," None"):
f.close()
return [] # if the file is empty or has None in some way I pass an empty stack
else:
stack = [] # the list where I load all my class objects
f.seek(0,0)
for line in f:
contact.loadFromString(line) # explained bellow
stack.append(deepcopy(contact))
f.close()
return stack

loadFromString(line) 中,我所做的只是验证该行(查看其中的数据是否至少看起来正常)。

现在这里是我验证刚从文件中读取的字符串的地方:

def validateString (load_string):
string = string.split("+")
if len (string) != 4:
print ("System error in loading from file: Program skipping segment of corrupt data")
return False
if string[0] == "" or string[0] == " " or string[0] == None or string[0] == "None" or string[0] == " None":
print ("System error in loading from file: Name field cannot be empty")
try:
int(string[1])
except:
print("System error in loading from file: ID is not integer")
return False
if (validateTel(str(string[2])) == False):
print ("System error in loading from file: Call ID (telephone number)")
return False
return True

小回顾:我尝试使用 loadFromString() 从文件加载数据。唯一相关的事情是它尝试使用 validateString(string) 验证我的数据,唯一让我感到困惑的是 validateTel。但是我的输入数据以与我存储的数据相同的方式得到验证。它们完全相同,但它给出了一个“系统错误”但是给出这样的错误它应该也在验证子程序中给出一个错误但它没有。

我希望这是足够的信息,因为我的程序有点大(无论如何对我来说)但是错误应该在某个地方。

我感谢任何勇敢地从这个烂摊子中筛选出来的人。

编辑:

这个类很简单,看起来像这样:

    class contact:
def __init__ (self, name = None, ID = None, tel = None, address = None):
self.__name = name
self.__id = ID
self.__tel = tel
self.__address = address

在此之后我有一系列的 setter 和 getter(用于修改联系人和返回部分抽象数据)

这里我也有我的 loadFromString 和 loadToString 但它们工作得很好(除了它们可能会在每一行(一个空行)之后导致一个小跳转,然后杀死我的程序,但我可以处理)

我的问题出在验证中的某处或存储库与其交互的方式中。关键是,即使它在加载数据时出错,首先验证应该打印错误......但它不会 -_-

最佳答案

你说 我只是想不通,老实说,我无法理解哪里出了问题。我认为这是一句很好的引述,概括了编程和软件开发的很大一部分——处理疯狂、怪异的问题并花费大量时间试图解决这些问题。

弄清楚如何将极其复杂的问题转化为小的、易于管理的问题是编程中最困难的部分,但也可以说是最重要和最有值(value)的部分。


以下是一些我认为可能对您有所帮助的一般性建议:

  • 为函数和变量使用有意义的名称(validateString 没有告诉我任何关于函数的作用;string 没有告诉我任何关于其内容的含义)
  • 将问题分解成小的、定义明确的部分
  • 指定您的数据 -- 什么是电话号码?10 个正数,没有空格,没有标点符号?
  • 记录/注释函数的输入/输出(如果不明显的话)

具体建议:

  • validateTel 可能会被替换为简单的正则表达式匹配
  • 尝试使用json进行序列化
  • 如果您使用的是 json,那么使用列表很容易。我强烈建议使用 + 作为分隔符——这对我来说非常值得怀疑

示例:使用正则表达式

import re

def validateTel(call_ID):
phoneNumberRegex = re.compile("^\d{10}$") # match a string of 10 digits
return phoneNumberRegex.match(call_ID)

示例:使用 json

import json
phoneNumber1, phoneNumber2, phoneNumber3 = ... whatever ...
mylist = [phoneNumber1, phoneNumber2, phoneNumber3]
print json.dumps(mylist)

关于Python 试图从文件中写入和读取类,但出现了可怕的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8248700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com