2014-11-01 6 views
0

나는 현재 학교 과제를위한 프로그램을 만들고 있는데, 사용자에게 임의로 생성 된 10 가지 질문 중 3 세트를 묻고, 그 결과에 따라 3 가지 텍스트 파일 중 하나에 결과를 저장합니다. 텍스트 파일에서 모든 데이터를로드 할 수 있으므로 다음 학생이 퀴즈를 풀면 결과가 나머지 부분에 추가됩니다. 사용자가 속한 클래스에 따라 "class1", "class2"또는 "class3"이라는 목록에 저장됩니다. 그런 다음 데이터를 다른 방식으로 정렬 할 수 있습니다. 이 게시물에서는 사용자가 클래스 1에 있다고 가정합니다.파이썬에서 텍스트 파일을 목록으로 변환하는 방법은 무엇입니까?

이 프로그램은 퀴즈에서 사용자 이름, 최고 점수, 평균 점수 및 세 번 시도를 추적하여 "class1"목록에 저장합니다. 아래 목록은 "class1"입니다.

[('Albert', 6, 2, [6, 0, 0]), ('Bob', 6, 2.33, [6, 1, 0]), ('Cameron', 5, 4, [5, 2, 5])]. 

프로그램이 실행 된 적이없는 경우 "Class 1 Data.txt"라는 새 텍스트 파일을 만듭니다. 이 파일이 이미 존재하는 경우, 그러나, 다음 코드의 다음 섹션에서는 실행 :

변수 "oldData"
f = open("C:/Users/Custom/Desktop/Class " + str(classNumber) + " Data.txt", "r") 
lines = f.readlines() 
oldData = lines[3] 

지금 "[('알버트', 6, 2, [6, 0을 포함하는 단지 긴 문자열입니다 , 0]) ... ". 이제 프로그램이 꺼진 다음 Zara라는 다른 학생이로드 한 다음 퀴즈를 푸는 것으로 가정합니다. 내가 다시 목록 '클래스 1'로 다시 추가하려고 할 때 "oldData는"단지 문자열이 아니라 목록이기 때문에 다음과 같은 절차가 진행됩니다

[('Zara', 9, 6, [3, 9, 6]), "[('Albert', 6, 2, [6, 0, 0]), ('Bob', 6, 2.33, [6, 1, 0]), ('Cameron', 5, 4, [5, 2, 5])]\n"] 

는 어떻게 텍스트를로드 할 가겠어요 파일로 저장 한 다음 목록으로 저장 하시겠습니까? 나는 다양한 방법을 사용하여 시도했지만, 그들 중 누구도 일하지 못했습니다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

내가 게시 한 항목 올리기 –

+0

.split()을 사용하여 사용자 이름, 최고 점수, 평균 점수 및 시도를 나누려고했지만 다음과 같이 나타납니다. Old Data List : [ "[('Albert ',', ','6 ','2 ','[6, ','0, ','0])]]. 나는 또한 단순히 "class1"을 문자열로 변환하려고 시도했으나 작동하지 않습니다. – Monkeymad358

답변

0

데이터의 텍스트 표현 (파이썬 내)을 텍스트 파일에 복사하여 붙여 넣은 것처럼 보입니다. 이제 텍스트를 가져 와서 (텍스트에서) 파이썬 데이터 구조로 다시 변환하려고합니다. . 이것은 그렇게하는 지나치게 복잡한 방식이라고 생각합니다. 구문 분석에 포함 된 구문 분석기 및 문법은 상당히 복잡하며이를 재현하는 것은 매우 어려울 수 있습니다. 게다가 나는 당신의 시간을 소중하게 사용한다고 생각하지 않습니다. 두 가지 선택이 당신을 잎

:

  1. 실제로 디스크에 파이썬 유형을 직렬화하고 싶은 경우에, 나는 강하게 pickle 라이브러리를 사용하려고 시도하는 것이 좋습니다. 이것은 약간 복잡하지만, 한번 익숙해지면 평범한 오래된 텍스트에서 파싱을 시도하기보다는 완전히 임의의 복잡성을 가진 피클을 피클 링하고 피클 할 수 있어야합니다.

  2. 만약 그렇게하지 않으면 데이터를 텍스트로 저장하는 더 예측 가능하고 더 쉽게 파싱 된 방법을 찾아야합니다.

  3. 프로그램 자체 내에서 데이터를보다 쉽게 ​​캡슐화 할 수있는 클래스를 만들어야합니다. 문자열과 정수의 튜플 목록과 정수 목록이 있습니다. 어떤 객체 지향적 인 구조도없이 빠져 나가는 것이 조금 있습니다.

    name:Zara highscore:9 averagescore:6 attempt1:3 attempt2:9 attempt3:6 
    name:Albert highscore:6 averagescore:2 attempt1:6 attempt2:0 attempt3:0 
    

    을 또는 당신은 XML을 사용한다면, 당신은 당신의 문서를 저장할 때 수 :

예를 들어, 방법 파이썬 유형에 묶여 아니에요 다른 텍스트 표현을 사용한다면 보일 다음과 같이하십시오 :

<users> 
    <user name="yrName" highscore="yrScore" averagescore="yrAverage" 
      attempt1="1" attempt2="2" attempt3="3">  
    </user> 
    <user> 
     ... 
</users> 

xml.etree.ElementTree를 사용하여 노드를 탐색하고 필요한 각 정보를 선택할 수 있습니다.

이 질문에 대한 가장 큰 질문은 의 데이터를 저장하는 이유가 아니라는 것입니다. 당신은 왜 그런 식으로 데이터를 많이 저장했는지 이유는 무엇입니까? 데이터의 40 % (모든 높은 점수와 평균 점수)는 저장할 이유가 없습니다. 이 수치는 세 번의 시도에 대한 액세스 권한이있는 경우 쉽게 계산되며, 이렇게 작성하면 방금 (1 + 2 + 3)/3 또는 분 ([1, 2, 3])을 사용하는 것보다 훨씬 더 효과적입니다.

+0

나는 두 번째 옵션을해야한다고 생각한다. 내가 지금하고있는 일을하려고하는 것은 내가 처음 생각했던 것보다 훨씬 복잡하다. 저는 현재 학교에서 파이썬의 기초 만 배웠습니다. 그래서 XML과 같은 것을 배웠습니다. 내가 할 수있는 일은 각각의 정보를 텍스트 파일에 별도의 줄에 저장하는 것인데, 어쨌든 어쨌든 더 깔끔하게 보일 것이며 readlines()를 사용하여 변수에 줄을 추가 한 다음 " class1 ". 비슷한 문제가있는 다른 사람들을 위해 솔루션을 게시 해 주셔서 감사합니다. – Monkeymad358

+0

실제로, 내 데이터의 40 %가 저장 될 필요가 없다는 편집을 읽은 후, 마지막 세 번 시도한 사용자만으로 목록을 작성한 다음 텍스트 파일에 인쇄 할 때 계산할 수 있습니다 . 그 점을 지적 해 주셔서 감사합니다. – Monkeymad358

+0

@ Monkeymad358 너의 인생을 훨씬 편하게 만들어야 해. 특히 텍스트 파일에 데이터를 저장하는 경우 가능한 한 간단하게 유지하십시오. – furkle

관련 문제