[PYTHON] 파일에서 읽은 목록의 줄 바꿈 문자 제거 [duplicate]
PYTHON파일에서 읽은 목록의 줄 바꿈 문자 제거 [duplicate]
나는 ID 번호를 취하고 ID와 일치하는 사람의 정보를 인쇄하는 간단한 프로그램을 가지고있다. 정보는 .dat 파일에 저장되며 한 줄에 하나의 ID 번호가 있습니다.
문제는 내 프로그램이 파일에서 개행 문자 \ n을 읽는 것입니다. 'name '.split () 메서드를 시도했지만 목록에 대해 작동하지 않는 것 같습니다.
내 프로그램 :
from time import localtime, strftime
files = open("grades.dat")
request = open("requests.dat", "w")
lists = files.readlines()
grades = []
for i in range(len(lists)):
grades.append(lists[i].split(","))
cont = "y"
while cont == "y" or cont == "Y":
answer = raw_input("Please enter the Student I.D. of whom you are looking: ")
for i in range(len(grades)):
if answer == grades[i][0]:
print grades[i][1] + ", " + grades[i][2] + (" "*6) + grades[i][0] + (" "*6) + grades[i][3]
time = strftime("%a, %b %d %Y %H:%M:%S", localtime())
print time
print "Exams - " + grades[i][11] + ", " + grades[i][12] + ", " + grades[i][13]
print "Homework - " + grades[i][4] + ", " + grades[i][5] + ", " + grades[i][6] + ", " + grades[i][7] + ", " +grades[i][8] + ", " + grades[i][9] + ", " + grades[i][10]
total = int(grades[i][4]) + int(grades[i][5]) + int(grades[i][6]) + int(grades[i][7]) + int(grades[i][8]) + int(grades[i][9]) + int(grades[i][10]) + int(grades[i][11]) + int(grades[i][12]) + int(grades[i][13])
print "Total points earned - " + str(total)
grade = float(total) / 550
grade = grade * 100
if grade >= 90:
print "Grade: " + str(grade) + ", that is equal to an A."
elif grade >= 80 and grade < 90:
print "Grade: " + str('%.2f' %grade) + ", that is equal to a B."
elif grade >= 70 and grade < 80:
print "Grade: " + str('%.2f' %grade) + ", that is equal to a C."
elif grade >= 60 and grade < 70:
print "Grade: " + str('%.2f' %grade) + ", that is equal to a D."
else:
print "Grade: " + str('%.2f' %grade) + ", that is equal to an F."
request.write(grades[i][0] + " " + grades[i][1] + ", " + grades [i][2] +
" " + time)
request.write("\n")
print
cont = raw_input("Would you like to search again? ")
if cont != "y" or cont != "Y":
print "Goodbye."
해결법
-
==============================
1.str.strip ()은 선행 + 후행 공백이 제거 된 문자열을 반환하고 .lstrip 및 .rstrip은 각각 앞과 뒤에만 사용합니다.
str.strip ()은 선행 + 후행 공백이 제거 된 문자열을 반환하고 .lstrip 및 .rstrip은 각각 앞과 뒤에만 사용합니다.
grades.append(lists[i].rstrip('\n').split(','))
-
==============================
2.strip () 함수를 사용하여 후행 (및 선행) 공백을 제거 할 수 있습니다. 인수를 전달하면 공백을 지정할 수 있습니다.
strip () 함수를 사용하여 후행 (및 선행) 공백을 제거 할 수 있습니다. 인수를 전달하면 공백을 지정할 수 있습니다.
for i in range(len(lists)): grades.append(lists[i].strip('\n'))
파일 하나에 줄 ID 하나만 저장하면 줄 바꿈이 제거 된 목록 일 뿐이므로 전체 블록을 단순화 할 수있는 것처럼 보입니다.
lists = files.readlines() grades = [] for i in range(len(lists)): grades.append(lists[i].split(","))
grades = [x.strip() for x in files.readlines()]
(위 목록은 이해력입니다)
마지막으로 인덱스를 사용하는 대신 목록을 직접 반복 할 수 있습니다.
for i in range(len(grades)): # do something with grades[i]
for thisGrade in grades: # do something with thisGrade
-
==============================
3.실제로 전체 파일을 하나의 긴 문자열로 메모리에 읽어 들여 새 줄을 잘 사용할 수있게 만든 다음이를 사용하여 그 파일을 성적 목록에 분할 할 수 있습니다.
실제로 전체 파일을 하나의 긴 문자열로 메모리에 읽어 들여 새 줄을 잘 사용할 수있게 만든 다음이를 사용하여 그 파일을 성적 목록에 분할 할 수 있습니다.
with open("grades.dat") as input: grades = [line.split(",") for line in input.read().splitlines()] etc...
-
==============================
4.다음은 코드 최적화에 필요한 다양한 파이썬 스타일 최적화 및 응용 프로그램입니다. csv 모듈을 사용하여 일부 선택적 코드를 넣었습니다. 수동으로 구문 분석하는 것보다 더 바람직합니다. 또한 약간의 namedtuple 장점을 넣었지만, 그때 제공하는 속성을 사용하지 않습니다. 명명 된 튜플의 부분 이름이 정확하지 않은 경우이를 수정해야합니다.
다음은 코드 최적화에 필요한 다양한 파이썬 스타일 최적화 및 응용 프로그램입니다. csv 모듈을 사용하여 일부 선택적 코드를 넣었습니다. 수동으로 구문 분석하는 것보다 더 바람직합니다. 또한 약간의 namedtuple 장점을 넣었지만, 그때 제공하는 속성을 사용하지 않습니다. 명명 된 튜플의 부분 이름이 정확하지 않은 경우이를 수정해야합니다.
import csv from collections import namedtuple from time import localtime, strftime # Method one, reading the file into lists manually (less desirable) with open('grades.dat') as files: grades = [[e.strip() for e in s.split(',')] for s in files] # Method two, using csv and namedtuple StudentRecord = namedtuple('StudentRecord', 'id, lastname, firstname, something, homework1, homework2, homework3, homework4, homework5, homework6, homework7, exam1, exam2, exam3') grades = map(StudentRecord._make, csv.reader(open('grades.dat'))) # Now you could have student.id, student.lastname, etc. # Skipping the namedtuple, you could do grades = map(tuple, csv.reader(open('grades.dat'))) request = open('requests.dat', 'w') cont = 'y' while cont.lower() == 'y': answer = raw_input('Please enter the Student I.D. of whom you are looking: ') for student in grades: if answer == student[0]: print '%s, %s %s %s' % (student[1], student[2], student[0], student[3]) time = strftime('%a, %b %d %Y %H:%M:%S', localtime()) print time print 'Exams - %s, %s, %s' % student[11:14] print 'Homework - %s, %s, %s, %s, %s, %s, %s' % student[4:11] total = sum(int(x) for x in student[4:14]) print 'Total points earned - %d' % total grade = total / 5.5 if grade >= 90: letter = 'an A' elif grade >= 80: letter = 'a B' elif grade >= 70: letter = 'a C' elif grade >= 60: letter = 'a D' else: letter = 'an F' if letter = 'an A': print 'Grade: %s, that is equal to %s.' % (grade, letter) else: print 'Grade: %.2f, that is equal to %s.' % (grade, letter) request.write('%s %s, %s %s\n' % (student[0], student[1], student[2], time)) print cont = raw_input('Would you like to search again? ') print 'Goodbye.'
-
==============================
5.공백 문자 또는 chars 인수에 지정한 문자 ( '\ n'등)를 제거 할 String.strip (s [, chars]) 함수가 필요합니다.
공백 문자 또는 chars 인수에 지정한 문자 ( '\ n'등)를 제거 할 String.strip (s [, chars]) 함수가 필요합니다.
http://docs.python.org/release/2.3/lib/module-string.html을 참조하십시오.
from https://stackoverflow.com/questions/4319236/remove-the-newline-character-in-a-list-read-from-a-file by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] SSL : Python3을 사용하여 CERTIFICATE_VERIFY_FAILED (0) | 2018.11.20 |
---|---|
[PYTHON] numpy를 사용하는 가중 백분위 수 (0) | 2018.11.20 |
[PYTHON] 대소 문자 무시 문자열에서 부분 문자열을 일치시키는 방법은 무엇입니까? (0) | 2018.11.20 |
[PYTHON] Python 정규식, 여러 줄에 걸쳐 패턴 일치. 왜이 코드가 작동하지 않습니까? (0) | 2018.11.20 |
[PYTHON] 가치에 기반한 팬더 조회 (0) | 2018.11.20 |