복붙노트

[PYTHON] 파이썬에서 한 파일의 무작위 라인을 읽으려면 어떻게해야합니까?

PYTHON

파이썬에서 한 파일의 무작위 라인을 읽으려면 어떻게해야합니까?

거기에 내장 된 방법이 있나요? 너무 많은 오버 헤드를 들이지 않고 어떻게이 작업을 수행 할 수 있습니까?

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.그것은 "너무 많은"오버 헤드가 무엇을 의미하는지에 달려 있습니다. 메모리에 전체 파일을 저장할 수 있다면

    그것은 "너무 많은"오버 헤드가 무엇을 의미하는지에 달려 있습니다. 메모리에 전체 파일을 저장할 수 있다면

    import random
    
    random_lines = random.choice(open("file").readlines())
    

    속임수를 쓸거야.

  4. ==============================

    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. ==============================

    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. ==============================

    6.임의의 위치로 탐색하고 한 행을 읽고 버린 다음 다른 행을 읽습니다. 줄의 분포는 정상적인 것은 아니지만 항상 중요하지는 않습니다.

    임의의 위치로 탐색하고 한 행을 읽고 버린 다음 다른 행을 읽습니다. 줄의 분포는 정상적인 것은 아니지만 항상 중요하지는 않습니다.

  7. ==============================

    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. ==============================

    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. ==============================

    9.

    import random
    
    with open("file.txt", "r") as f:
        lines = f.readlines()
        print (random.choice(lines))
    
  10. 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