파일의 첫 번째 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))
가장 직관적인 두 가지 방법은 다음과 같습니다.
파일을 한 줄 한 줄 반복하여
break
끝나고N
줄들.를 사용하여 파일을 한 줄씩 반복합니다.
next()
방법N
times. (이것은 기본적으로 상위 답변의 구문과 다를 뿐입니다.)
코드는 다음과 같습니다.
# 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
'IT' 카테고리의 다른 글
SQL Query 결과를 PANDA Data Structure로 변환하는 방법 (0) | 2022.11.17 |
---|---|
MySQL 오류 #1071 - 지정된 키가 너무 깁니다. 최대 키 길이는 767바이트입니다. (0) | 2022.11.17 |
원칙에서 findBy()를 사용하여 결과를 정렬하는 방법 (0) | 2022.11.17 |
시퀀스 첨자를 붙일 때 Python에서 ::(이중 콜론)이란 무엇입니까? (0) | 2022.11.08 |
MariaDB에서 조인된 테이블을 기반으로 행을 업데이트하려면 어떻게 해야 합니까? (0) | 2022.11.08 |