파일에서 읽을 때 클래스 이니셜 라이저에서 따옴표를 제거하려면 어떻게해야합니까? 파이썬

StackOverflow https://stackoverflow.com/questions/19825504

문제

.dat 파일의 배열에 클래스 작업에 호출을 저장하고 있습니다. 이 파일을 읽고 클래스 호출을 재구성하고 싶습니다.

내가 지금 사용하고있는 수업은 다음과 같습니다.

class Task:

    def __init__(self, name, timespent):
        self.name = name
        self.timespent = timespent

    def __repr__(self):
        return repr('Task("%s",%s)'%(self.name, self.timespent))

파일의 읽기는 다음과 같습니다.

task_list = []
with open("task_list2.dat", "r") as file:
    task_list = eval(file.readline())

파일에 대한 글은 다음과 같습니다.

with open("task_list2.dat", "w") as outFile:
    print(repr(task_list), file = outFile)

그리고 여기 파일의 내용은 다음과 같습니다.['Task("class",20)']여기서 "클래스"는 작업의 이름입니다.

나는 문제가 '작업 ( "클래스", 20) 주변의 단일 인용문과 관련이 있다는 것을 이해하지만, 그들을 제거하는 방법은 없습니다. 내가 얻는 오류 메시지는 다음과 같은 줄을 따라 무언가를 말합니다. "str 객체는 속성 '이름'이 없습니다."

다음에 파일을 읽을 때 클래스를 재구성 할 수 있도록 따옴표를 제거하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

당신은 정말로, 정말로, 정말로, 정말로 사용하고 싶지 않습니다 repr 그리고 eval 직렬화 형식으로.

방금 사용했다면 pickle, 당신은이 문제가 전혀 없을 것입니다.

with open("task_list2.dat", "wb") as outFile:
    pickle.dump(task_list, outFile)

with open("task_list2.dat", "rb") as file:
    task_list = pickle.load(file)

훨씬 단순 해요?


그러나 무의미하게 만드는 대신 즉각적인 문제를 해결하는 방법을 알고 싶다면 : 여러분은 여러 가지 문제가 있습니다. __repr__ 메소드는 왕복이 가능하기를 원한다면 모두 수정해야합니다.

  • 문자열 표현을 생성 한 다음 전화합니다 repr 그 위에. 문자열 표현이 아닌 문자열 표현을 반환하고 싶습니다. 문자열 표현. 그냥 꺼내십시오 repr.
  • 당신은 항상 그에게 위임해야합니다 repr 하위 객체의 str. 사용하는 경우 %-형성, 즉 사용을 의미합니다 %r 보다는 %s.
  • 물건 주위에 인용문을 추가하려고하지 마십시오. 객체 자체에 인용문, 백 슬래시, 보이지 않는 캐릭터 등이 없으면 작동 할 수 있지만 왜 그에 의존합니까? 인용문이 필요하다고 생각되면 항상 이전 규칙을 깨뜨렸다는 신호이며 대신 문제를 해결해야합니다.

이 수업에 대해 왕복 가능한 repr을 작성하는 방법은 다음과 같습니다.

def __repr__(self):
    return 'Task(%r, %r)' % (self.name, self.timespent))

그리고 원하는 것을 확인할 수 있습니다.

>>> t = Task('task name', 23.4)
>>> t
Task('task name', 23.4)
>>> eval(repr(t))
Task('task name', 23.4)

물론 특정 예에서는 첫 번째 문제를 해결합니다 (가짜 호출 제거 repr)는 단일 인용문을 제거하고 특정 예제를 작동 시켰을 것입니다. 당신은 또한 전화로 읽기 쪽에서 그것을 해킹 할 수 있습니다. eval 두 배. 또는이 특정 예를 위해 eval(s[1:-1]) 또는 eval(s.strip("'")). 그러나 그와 같은 "수정"은 단일 All-Ascii-retter Word만큼 간단하지 않은 이름을 가지고 있으면 일단 가지고 나올 일반적인 문제를 디버깅하기가 더 어려워집니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top