2011-10-01 4 views
0

어제 비슷한 질문을했지만 필자가 의도 한 것보다 다른 접선에 기본적으로 내 질문을 던진 코드를 포함 시켰습니다. 그래서 나는 다시 시도 할 것이다.웹 사이트의 파일 열기

나는 몇백 개의 텍스트 파일을 찾기 위해 웹 사이트를 크롤링하는 python 스크립트를 다시 작성하고 있는데, 파일의 두 번째 줄을 넘는 텍스트 파일의 내용에는 관심이 없습니다. 이전에 모든 파일을 다운로드 한 다음 두 번째 줄을 추출하기 위해 모두 반복했습니다. 내 스크립트가 파일을 발견하고 두 번째 줄을 잡고 내 하드 드라이브에 다운로드하지 않고 닫은 다음 파일을 열 때 각 파일을 열고 싶습니다.

그래서 기본적으로 www.example.com/123456.txt에있는 파일을 열어서 그 파일에서 두 번째 줄을 가져 와서 배열이나 다른 것으로 복사 한 다음 파일을 열지 않고 열 수 있습니다.

+0

아니 나는, 그 알고 메모리에 파일을 열 후 폐기는 urlopen'이를 반환'이후 바로 – jimstandard

+2

에 대해 소리 파일과 같은 객체라면'readline'을 두 번 사용하면 버퍼링에 따라 전체 파일을 다운로드하지 않아도됩니다. 어쨌든 대용량 파일을 일부 전송할 수는 있습니다. –

답변

2

글쎄, urllib2.urlopen()을 사용하여 파일 내용을 메모리에 가져 와서 두 번째 줄을 추출한 다음 원한다면 즉시 디스크를 두드리지 않고 메모리에서 파일을 즉시 버릴 수 있습니다.

이지만 인터넷을 통해 콘텐츠를 다운로드해야합니다.

1

당신은 urllib2.urlopen('url').read().splitlines()[1] 뭔가를 시도 할 수 있지만, 나는 당신이 주먹 N 라인을 검색 (또는 선이 추구 수행) 할 수없는 메모리

+0

'urlopen' 객체는'readline()'을 지원하지 않습니까? – agf

1

에 전체 파일을 다운로드 할 생각하지만, 웹 서버는 Range 헤더를 지원하는 경우 파일의 처음 N 바이트를 검색 할 수 있습니다 (바이트 탐색). 당신이 라인의 최대 길이를 알고있는 경우

, 당신이 할 수 없었다 :

>>> import urllib2 
>>> maxlinelength = 127 # nb: in terms of bytes 
>>> myHeaders = {'Range':'bytes=0-'+str(maxlinelength)} # from byte 0 to maxlinelength 
>>> req = urllib2.Request('http://www.constitution.org/gr/pericles_funeral_oration.txt', headers=myHeaders) 
>>> partial = urllib2.urlopen(req) 
>>> partial.readline() # first line discarded 
>>> yourvar = partial.readline() 
>>> yourvar # this is the second line: 
'from Thucydides (c.460/455-399 BCE), \r\r\n'