IT story

열린 파일에서 read ()를 두 번 호출 할 수없는 이유는 무엇입니까?

hot-time 2020. 9. 15. 19:26
반응형

열린 파일에서 read ()를 두 번 호출 할 수없는 이유는 무엇입니까?


내가하고있는 연습을 위해, 나는 read()방법을 사용하여 주어진 파일의 내용을 두 번 읽으려고 노력하고있다 . 이상하게도 두 번째로 호출하면 파일 내용을 문자열로 반환하지 않는 것 같습니다.

다음은 코드입니다.

f = f.open()

# get the year
match = re.search(r'Popularity in (\d+)', f.read())

if match:
  print match.group(1)

# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', f.read())

if matches:
  # matches is always None

물론 이것이 가장 효율적이거나 최선의 방법이 아니라는 것을 알고 있습니다. 이것은 여기서 요점이 아닙니다. 요점은, 왜 read()두 번 전화 할 수 없습니까? 파일 핸들을 재설정해야합니까? 아니면 파일을 닫거나 다시여시겠습니까?


호출 read()하면 전체 파일을 읽고 파일 끝에 읽기 커서가 남습니다 (더 이상 읽을 내용 없음). 한 번에 라인의 특정 숫자를 읽을 찾고 있다면 당신은 사용할 수 있습니다 readline(), readlines()또는 반복 처리로 라인을 통해 for line in handle:.

질문에 직접 답하려면 파일을 읽은 후을 read()사용 seek(0)하여 읽기 커서를 파일의 시작 부분으로 되돌릴 수 있습니다 (문서는 여기에 있음 ). 파일이 너무 크지 않을 것임을 알고 있다면 read()findall 표현식에서 사용하여 출력을 변수에 저장할 수도 있습니다 .

추신. 작업이 끝나면 파일을 닫는 것을 잊지 마십시오.)


네, 위와 같이 ...

나는 단지 예를 쓸 것이다.

>>> a = open('file.txt')
>>> a.read()
#output
>>> a.seek(0)
>>> a.read()
#same output

지금까지이 질문에 답한 모든 사람은 절대적으로 옳 read()습니다. 파일을 통해 이동하므로 호출 한 후에는 다시 호출 할 수 없습니다.

내가 추가 할 것은 특정 경우에 처음으로 돌아가거나 파일을 다시 열 필요가 없으며 읽은 텍스트를 지역 변수에 저장하고 두 번 사용할 수 있다는 것입니다. 프로그램에서 원하는만큼 여러 번 :

f = f.open()
text = f.read() # read the file into a local variable
# get the year
match = re.search(r'Popularity in (\d+)', text)
if match:
  print match.group(1)
# get all the names
matches = re.findall(r'<td>(\d+)</td><td>(\w+)</td><td>(\w+)</td>', text)
if matches:
  # matches will now not always be None

읽기 포인터는 마지막으로 읽은 바이트 / 문자 뒤로 이동합니다. seek()메서드를 사용하여 읽기 포인터를 처음으로 되감습니다.


열려있는 모든 파일에는 연관된 위치가 있습니다.
read ()하면 그 위치에서 읽습니다. 예를 들어 read(10)새로 열린 파일에서 처음 10 바이트를 read(10)읽은 다음 다른 파일 은 다음 10 바이트를 읽습니다. read()인수 없이는 파일의 모든 내용을 읽고 파일의 끝에 파일 위치를 남깁니다. 다음에 전화 할 때는 read()읽을 것이 없습니다.

You can use seek to move the file position. Or probably better in your case would be to do one read() and keep the result for both searches.


read() consumes. So, you could reset the file, or seek to the start before re-reading. Or, if it suites your task, you can use read(n) to consume only n bytes.


I always find the read method something of a walk down a dark alley. You go down a bit and stop but if you are not counting your steps you are not sure how far along you are. Seek gives the solution by repositioning, the other option is Tell which returns the position along the file. May be the Python file api can combine read and seek into a read_from(position,bytes) to make it simpler - till that happens you should read this page.

참고URL : https://stackoverflow.com/questions/3906137/why-cant-i-call-read-twice-on-an-open-file

반응형