IT

파일의 첫 번째 N 행을 어떻게 읽습니까?

itgroup 2022. 11. 17. 21:07
반응형

파일의 첫 번째 N 행을 어떻게 읽습니까?

우리는 지정된 크기로 다듬고 싶은 큰 raw data 파일을 가지고 있습니다.

python에서 텍스트 파일의 첫 번째 N 행을 얻는 방법은 무엇입니까?사용하고 있는 OS가 구현에 영향을 미칩니까?

Python 3:

with open("datafile") as myfile:
    head = [next(myfile) for x in range(N)]
print(head)

Python 2:

with open("datafile") as myfile:
    head = [next(myfile) for x in xrange(N)]
print head

다음은 다른 방법(Python 2와 3)입니다.

from itertools import islice

with open("datafile") as myfile:
    head = list(islice(myfile, N))
print(head)
N = 10
with open("file.txt", "a") as file:  # the a opens it in append mode
    for i in range(N):
        line = next(file).strip()
        print(line)

퍼포먼스를 신경 쓰지 않고 첫 줄을 빠르게 읽고 싶다면 사용할 수 있습니다..readlines()목록 개체를 반환하고 목록을 슬라이스합니다.

예: 처음 5행:

with open("pathofmyfileandfileandname") as myfile:
    firstNlines=myfile.readlines()[0:5] #put here the interval you want

주의: 파일 전체를 읽기 때문에 퍼포먼스 면에서는 최적인 것은 아니지만 사용하기 쉽고, 쓰기 쉽고, 기억하기 쉽기 때문에 한 번만 계산하면 매우 편리합니다.

print firstNlines

다른 답변에 비해 한 가지 장점은 행의 범위를 쉽게 선택할 수 있다는 것입니다(예: 처음 10행 건너뛰기).[10:30]또는 마지막 10개[:-10]또는 짝수선만 가지고[::2].

제가 하는 일은 N회선을 호출하는 것입니다.pandas퍼포먼스가 최고는 아닌 것 같은데 예를 들면N=1000:

import pandas as pd
yourfile = pd.read_csv('path/to/your/file.csv',nrows=1000)

파일 객체에 의해 표시되는 줄 수를 읽는 특별한 방법은 없습니다.

가장 쉬운 방법은 다음과 같습니다.

lines =[]
with open(file_name) as f:
    lines.extend(f.readline() for i in xrange(N))

가장 직관적인 두 가지 방법은 다음과 같습니다.

  1. 파일을 한 줄 한 줄 반복하여break끝나고N줄들.

  2. 를 사용하여 파일을 한 줄씩 반복합니다.next()방법Ntimes. (이것은 기본적으로 상위 답변의 구문과 다를 뿐입니다.)

코드는 다음과 같습니다.

# Method 1:
with open("fileName", "r") as f:
    counter = 0
    for line in f:
        print line
        counter += 1
        if counter == N: break

# Method 2:
with open("fileName", "r") as f:
    for i in xrange(N):
        line = f.next()
        print line

요점은, 이 제품을 사용하지 않는 한readlines()또는enumerate파일 전체를 메모리에 입력해, 다양한 옵션을 사용할 수 있습니다.

gnibler top pollected answer (2009년 11월 20일 0:27): 이 클래스는 파일 객체에 head() 메서드와 tail() 메서드를 추가합니다.

class File(file):
    def head(self, lines_2find=1):
        self.seek(0)                            #Rewind file
        return [self.next() for x in xrange(lines_2find)]

    def tail(self, lines_2find=1):  
        self.seek(0, 2)                         #go to end of file
        bytes_in_file = self.tell()             
        lines_found, total_bytes_scanned = 0, 0
        while (lines_2find+1 > lines_found and
               bytes_in_file > total_bytes_scanned): 
            byte_block = min(1024, bytes_in_file-total_bytes_scanned)
            self.seek(-(byte_block+total_bytes_scanned), 2)
            total_bytes_scanned += byte_block
            lines_found += self.read(1024).count('\n')
        self.seek(-total_bytes_scanned, 2)
        line_list = list(self.readlines())
        return line_list[-lines_2find:]

사용방법:

f = File('path/to/file', 'r')
f.head(3)
f.tail(3)

나 혼자서도 가장 편리한 방법:

LINE_COUNT = 3
print [s for (i, s) in enumerate(open('test.txt')) if i < LINE_COUNT]

목록 이해에 기반한 솔루션 open() 함수는 반복 인터페이스를 지원합니다.enumerate()는 open()과 return tuples(index, item)를 커버합니다.그러면, 허가 범위내에 있는 것을 확인하고(i< LINE_COUNT 의 경우), 결과를 인쇄하기만 하면 됩니다.

Python을 즐겨보세요.;)

처음 5행의 경우 다음 작업을 수행합니다.

N=5
with open("data_file", "r") as file:
    for i in range(N):
       print file.next()

Import 및 시도/제외 없이 Python 2.x 버전(2.2~2.6)의 적절한 범위에서 동작하는 것을 원하는 경우:

def headn(file_name, n):
    """Like *x head -N command"""
    result = []
    nlines = 0
    assert n >= 1
    for line in open(file_name):
        result.append(line)
        nlines += 1
        if nlines >= n:
            break
    return result

if __name__ == "__main__":
    import sys
    rval = headn(sys.argv[1], int(sys.argv[2]))
    print rval
    print len(rval)

매우 큰 파일이 있고 출력을 numpy 배열로 하고 싶은 경우 np.genfromtx 를 사용하면 컴퓨터가 정지됩니다.제 경험상으로는 이게 훨씬 낫습니다.

def load_big_file(fname,maxrows):
'''only works for well-formed text file of space-separated doubles'''

rows = []  # unknown number of lines, so use list

with open(fname) as f:
    j=0        
    for line in f:
        if j==maxrows:
            break
        else:
            line = [float(s) for s in line.split()]
            rows.append(np.array(line, dtype = np.double))
            j+=1
return np.vstack(rows)  # convert list of vectors to array

이건 내게 효과가 있었다.

f = open("history_export.csv", "r")
line= 5
for x in range(line):
    a = f.readline()
    print(a)

파일 전체를 읽어서 n줄 미만의 파일을 처리하고 싶습니다.

def head(filename: str, n: int):
    try:
        with open(filename) as f:
            head_lines = [next(f).rstrip() for x in range(n)]
    except StopIteration:
        with open(filename) as f:
            head_lines = f.read().splitlines()
    return head_lines

존 라 루이와 일리안 일리예프에게 공로를 돌렸다.예외 핸들로 최고의 성능을 발휘하는 기능 사용

개정 1: FrankM에 대한 피드백에 감사드리며, 파일 존재 및 읽기 권한에 대해 향후 추가할 수 있습니다.

import errno
import os

def head(filename: str, n: int):
    if not os.path.isfile(filename):
        raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), filename)  
    if not os.access(filename, os.R_OK):
        raise PermissionError(errno.EACCES, os.strerror(errno.EACCES), filename)     
   
    try:
        with open(filename) as f:
            head_lines = [next(f).rstrip() for x in range(n)]
    except StopIteration:
        with open(filename) as f:
            head_lines = f.read().splitlines()
    return head_lines

두 번째 버전을 사용하거나 첫 번째 버전을 선택한 후 나중에 파일 예외를 처리할 수 있습니다.체크는 빠르고 대부분 퍼포먼스 관점에서 자유롭다

Python 2.6부터는 IO Base Clase에서 보다 정교한 기능을 활용할 수 있습니다.따라서 위의 상위 등급의 답변은 다음과 같이 고쳐 쓸 수 있습니다.

    with open("datafile") as myfile:
       head = myfile.readlines(N)
    print head

(StopIteration 예외가 발생하지 않으므로 파일의 행 수가 N개 미만인지 걱정할 필요가 없습니다.)

이것은 Python 2와 3에 유효합니다.

from itertools import islice

with open('/tmp/filename.txt') as inf:
    for line in islice(inf, N, N+M):
        print(line)

fname = input("Enter file name: ")
num_lines = 0

with open(fname, 'r') as f: #lines count
    for line in f:
        num_lines += 1

num_lines_input = int (input("Enter line numbers: "))

if num_lines_input <= num_lines:
    f = open(fname, "r")
    for x in range(num_lines_input):
        a = f.readline()
        print(a)

else:
    f = open(fname, "r")
    for x in range(num_lines_input):
        a = f.readline()
        print(a)
        print("Don't have", num_lines_input, " lines print as much as you can")


print("Total lines in the text",num_lines)

다음은 목록 이해 기능을 갖춘 또 다른 적절한 솔루션입니다.

file = open('file.txt', 'r')

lines = [next(file) for x in range(3)]  # first 3 lines will be in this list

file.close()
#!/usr/bin/python

import subprocess

p = subprocess.Popen(["tail", "-n 3", "passlist"], stdout=subprocess.PIPE)

output, err = p.communicate()

print  output

이 방법은 나에게 효과가 있었다

간단히 목록(file_data)을 사용하여 CSV 파일 개체를 목록으로 변환합니다.

import csv;
with open('your_csv_file.csv') as file_obj:
    file_data = csv.reader(file_obj);
    file_list = list(file_data)
    for row in file_list[:4]:
        print(row)

언급URL : https://stackoverflow.com/questions/1767513/how-to-read-first-n-lines-of-a-file

반응형