[PYTHON] 파이썬에서 한 파일의 무작위 라인을 읽으려면 어떻게해야합니까?
PYTHON파이썬에서 한 파일의 무작위 라인을 읽으려면 어떻게해야합니까?
거기에 내장 된 방법이 있나요? 너무 많은 오버 헤드를 들이지 않고 어떻게이 작업을 수행 할 수 있습니까?
해결법
-
==============================
1.내장되어 있지는 않지만 Knuth의 "Art of Computer Programming"의 알고리즘 R (3.4.2) (Waterman의 "Reservoir Algorithm")은 매우 간단합니다.
내장되어 있지는 않지만 Knuth의 "Art of Computer Programming"의 알고리즘 R (3.4.2) (Waterman의 "Reservoir Algorithm")은 매우 간단합니다.
import random def random_line(afile): line = next(afile) for num, aline in enumerate(afile, 2): if random.randrange(num): continue line = aline return line
num, ... in enumerate (..., 2) iterator는 시퀀스 2, 3, 4를 생성합니다. 그러므로 randrange는 1.0 / num의 확률로 0이 될 것입니다. 현재 선택된 선을 바꾸십시오 (참조 된 알고리즘의 표본 크기 1의 특수 경우 - 크 누스 (Knuth)의 정확성 증명을위한 책을 참조하십시오. 물론 작은 크기의 "저수지"의 경우도 마찬가지입니다 기억, -)) ... 그리고 우리가 그렇게하는 확률.
-
==============================
2.
import random lines = open('file.txt').read().splitlines() myline =random.choice(lines) print(myline)
매우 긴 파일 : 길이에 따라 파일에서 임의의 위치를 찾고 위치 (또는 개행과 파일 끝) 다음에 두 개의 개행 문자를 찾습니다. 마지막 줄 안쪽에서 끝나면 원본 찾기 위치가 100보다 작 으면 파일 시작 앞이나 뒤로 100자를 다시 입력하십시오.
그러나 파일이 iterator이기 때문에 이것은 복잡합니다. 목록을 작성하고 random.choice를 가져 오십시오 (많은 경우 random.sample 사용).
import random print(random.choice(list(open('file.txt'))))
-
==============================
3.그것은 "너무 많은"오버 헤드가 무엇을 의미하는지에 달려 있습니다. 메모리에 전체 파일을 저장할 수 있다면
그것은 "너무 많은"오버 헤드가 무엇을 의미하는지에 달려 있습니다. 메모리에 전체 파일을 저장할 수 있다면
import random random_lines = random.choice(open("file").readlines())
속임수를 쓸거야.
-
==============================
4.나는 4 년 늦었지 만 나는 가장 빠른 해결책을 가지고 있다고 생각한다. 최근 linereader라는 python 패키지를 작성하여 파일 핸들의 포인터를 조작 할 수있게했습니다.
나는 4 년 늦었지 만 나는 가장 빠른 해결책을 가지고 있다고 생각한다. 최근 linereader라는 python 패키지를 작성하여 파일 핸들의 포인터를 조작 할 수있게했습니다.
다음은이 패키지로 임의의 라인을 얻는 간단한 해결책입니다 :
from random import randint from linereader import dopen length = #lines in file filename = #directory of file file = dopen(filename) random_line = file.getline(randint(1, length))
linereader는 출력 파일을 특별한 형식으로 컴파일해야하기 때문에 처음으로 이것이 완료되었습니다. 이 작업이 끝나면 리니어 레이터는 파일의 크기에 관계없이 파일에서 모든 라인에 신속하게 액세스 할 수 있습니다.
파일이 매우 작 으면 (MB에 적당 할 정도로 작 으면) dopen을 copen으로 바꿀 수 있으며 메모리 내에서 파일의 캐시 된 항목을 만듭니다. 뿐만 아니라 이것은 더 빠르지 만 메모리에로드 될 때 파일 내의 줄 수를 얻습니다. 그것은 당신을 위해 이루어집니다. 랜덤 라인 번호를 생성하기 만하면됩니다. 이를위한 몇 가지 예제 코드가 있습니다.
from random import randint from linereader import copen file = copen(filename) lines = file.count('\n') random_line = file.getline(randint(1, lines))
내 패키지 혜택을 누릴 수있는 사람을 만났기 때문에 나는 정말로 행복해졌습니다! 죽은 대답에 대한 미안하지만, 패키지는 확실히 많은 다른 문제에 적용될 수 있습니다.
-
==============================
5.전체 파일을 읽지 않으려는 경우 파일의 중간 부분을 찾은 다음 줄 바꿈을 검색하고 readline을 호출 할 수 있습니다.
전체 파일을 읽지 않으려는 경우 파일의 중간 부분을 찾은 다음 줄 바꿈을 검색하고 readline을 호출 할 수 있습니다.
다음은이 작업을 수행하는 Python3 스크립트입니다.
이 방법의 한 가지 단점은 짧은 선이 나타날 확률이 낮다는 것입니다.
def read_random_line(f, chunk_size=16): import os import random with open(f, 'rb') as f_handle: f_handle.seek(0, os.SEEK_END) size = f_handle.tell() i = random.randint(0, size) while True: i -= chunk_size if i < 0: chunk_size += i i = 0 f_handle.seek(i, os.SEEK_SET) chunk = f_handle.read(chunk_size) i_newline = chunk.rfind(b'\n') if i_newline != -1: i += i_newline + 1 break if i == 0: break f_handle.seek(i, os.SEEK_SET) return f_handle.readline()
-
==============================
6.임의의 위치로 탐색하고 한 행을 읽고 버린 다음 다른 행을 읽습니다. 줄의 분포는 정상적인 것은 아니지만 항상 중요하지는 않습니다.
임의의 위치로 탐색하고 한 행을 읽고 버린 다음 다른 행을 읽습니다. 줄의 분포는 정상적인 것은 아니지만 항상 중요하지는 않습니다.
-
==============================
7.선을 무작위로 변경하는 set ()에 선을 추가 할 수 있습니다.
선을 무작위로 변경하는 set ()에 선을 추가 할 수 있습니다.
filename=open("lines.txt",'r') f=set(filename.readlines()) filename.close()
첫 번째 줄을 찾으려면,
print(next(iter(f)))
세 번째 줄 찾기 :
print(list(f)[2])
집합의 모든 행을 나열하려면 :
for line in f: print(line)
-
==============================
8.이것은 부피가 클 수 있지만 그것이 작동하는 것 같아요? (적어도 txt 파일의 경우)
이것은 부피가 클 수 있지만 그것이 작동하는 것 같아요? (적어도 txt 파일의 경우)
import random choicefile=open("yourfile.txt","r") linelist=[] for line in choicefile: linelist.append(line) choice=random.choice(linelist) print(choice)
파일의 각 행을 읽고 목록에 추가합니다. 그런 다음 목록에서 임의의 줄을 선택합니다. 한 번 선택한 선을 제거하려면
linelist.remove(choice)
희망이 도움이 될 수 있지만 적어도 추가 모듈 및 수입 (무작위로부터 떨어져) 및 상대적으로 가벼운.
-
==============================
9.
import random with open("file.txt", "r") as f: lines = f.readlines() print (random.choice(lines))
from https://stackoverflow.com/questions/3540288/how-do-i-read-a-random-line-from-one-file-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 : 다중 처리 풀을 사용하는 동안 큐가있는 단일 파일에 쓰기 (0) | 2018.10.29 |
---|---|
[PYTHON] OpenCV 도트 타겟 탐지가 모든 타겟을 찾지 못하고, 발견 된 원이 상쇄됩니다. (0) | 2018.10.29 |
[PYTHON] sympy를 통해 ipython 노트북에서 예쁘게 인쇄하는 방법? (0) | 2018.10.28 |
[PYTHON] cc1 : 오류 : Mac에서 python-mysql을 설치하는 동안 인식 할 수없는 명령 줄 옵션 "-Win-null-conversion"10.7.5 (0) | 2018.10.28 |
[PYTHON] matplotlib를 사용하여 boxplot에 점 분산을 추가합니다. (0) | 2018.10.28 |