Чтение первых N строк файла в python
У нас есть большой файл необработанных данных, который мы хотели бы обрезать до указанного размера. У меня есть опыт работы с .net С#, однако я хотел бы сделать это на python, чтобы упростить вещи и из интереса.
Как бы я получить первые N строк текстового файла в Python? Повлияет ли используемая ОС на реализацию?
Ответы
Ответ 1
Python 2
with open("datafile") as myfile:
head = [next(myfile) for x in xrange(N)]
print head
Python 3
with open("datafile") as myfile:
head = [next(myfile) for x in range(N)]
print(head)
Здесь другой способ (оба Python 2 и 3)
from itertools import islice
with open("datafile") as myfile:
head = list(islice(myfile, N))
print head
Ответ 2
N = 10
file = open("file.txt", "a")#the a opens it in append mode
for i in range(N):
line = file.next().strip()
print line
file.close()
Ответ 3
Если вы хотите быстро прочитать первые строки и вам не нужна производительность, вы можете использовать .readlines()
, который возвращает объект списка, а затем нарезает список.
например. для первых 5 строк:
with open("pathofmyfileandfileandname") as myfile:
firstNlines=myfile.readlines()[0:5] #put here the interval you want
Примечание. весь файл читается, поэтому не лучший из точки зрения производительности, но он прост в использовании, быстро записывается и легко запоминается, поэтому, если вы хотите просто выполнить некоторый разовый расчет очень удобен
print firstNlines
Ответ 4
То, что я делаю, это называть N строк, используя pandas
. Я думаю, что производительность не самая лучшая, но, например, если N=1000
:
import pandas as pd
yourfile = pd.read('path/to/your/file.csv',nrows=1000)
Ответ 5
Нет специального метода для чтения количества строк, открытых файлом.
Я думаю, что самый простой способ:
lines =[]
with open(file_name) as f:
lines.extend(f.readline() for i in xrange(N))
Ответ 6
Основываясь на голосовом ответе gnibbler top (ноябрь 20, 2009 в 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)
Ответ 7
Два наиболее интуитивных способа сделать это:
-
Перебирайте файл построчно и break
после N
строк.
-
Перебирайте файл построчно, используя метод next()
N
раз. (По сути, это просто другой синтаксис того, что делает верхний ответ.)
Вот код:
# 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
весь файл в память, у вас есть много вариантов.
Ответ 8
наиболее удобный способ:
LINE_COUNT = 3
print [s for (i, s) in enumerate(open('test.txt')) if i < LINE_COUNT]
Решение, основанное на List Comprehension
Функция open() поддерживает итерационный интерфейс. Элемент перечисления() охватывает open() и возвращает кортежи (индекс, элемент), затем мы проверяем, что мы находимся внутри принятого диапазона (если я < LINE_COUNT), а затем просто печатаем результат.
Наслаждайтесь Python.;)
Ответ 9
Если вы хотите что-то, что явно (без поиска эзотерического материала в руководствах) работает без импорта и пытается/исключается и работает на справедливом диапазоне версий 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)
Ответ 10
Начиная с Python 2.6, вы можете использовать более сложные функции в базовой класте IO. Поэтому вышеприведенный ответ можно переписать следующим образом:
with open("datafile") as myfile:
head = myfile.readlines(N)
print head
(Вам не нужно беспокоиться о том, что ваш файл имеет меньше, чем N строк, так как не исключено исключение StopIteration.)
Ответ 11
Если у вас действительно большой файл, и если вы хотите, чтобы выход был массивом numpy, использование np.genfromtxt заморозит ваш компьютер. Это намного лучше в моем опыте:
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
Ответ 12
Для первых 5 строк просто выполните:
N=5
with open("data_file", "r") as file:
for i in range(N):
print file.next()
Ответ 13
#!/usr/bin/python
import subprocess
p = subprocess.Popen(["tail", "-n 3", "passlist"], stdout=subprocess.PIPE)
output, err = p.communicate()
print output
Этот метод работал у меня
Ответ 14
Это сработало для меня
f = open("history_export.csv", "r")
line= 5
for x in range(line):
a = f.readline()
print(a)