Как напечатать первые N строк файла в python с N в качестве аргумента

Как мне получить первые N строк текстового файла в python? С N нужно указать в качестве аргумента

Применение:

python file.py datafile -N 10

Мой код

import sys
from itertools import islice

args = sys.argv
print (args)
if args[1] == '-h':
    print ("-N for printing the number of lines: python file.py datafile -N 10")

if args[-2] == '-N':
    datafile = args[1]
    number = int(args[-1])
    with open(datafile) as myfile:
        head = list(islice(myfile, number))
        head = [item.strip() for item in head]

        print (head)
        print ('\n'.join(head))

Я написал программу, может дайте мне знать лучше, чем этот код

какую ошибку/вывод вы получили?

Andrew Daly 24.07.2019 10:20

Ваш код точно такой же, как ответ здесь: stackoverflow.com/questions/1767513/… Мне было интересно, в чем проблема.

N. Arunoprayoch 24.07.2019 10:21

У меня отлично работает. Да как привести аргумент с Н.

user6882757 24.07.2019 10:24
stackoverflow.com/questions/4033723/… Не совсем дубликат, но это может вам помочь.
Simon Brahan 24.07.2019 10:27

Имейте в виду, что sys.argv[0] — это имя вашего скрипта. sys.argv[1] — первый аргумент.

Simpl 24.07.2019 11:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
656
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Аргументы доступны через пакет sys.


Пример 1: ./file.py datafile 10

#!/usr/bin/env python3

import sys

myfile = sys.argv[1]
N = int(sys.argv[2])

with open("datafile") as myfile:
    head = myfile.readlines()[0:args.N]
print(head)

Пример 2: ./file.py datafile --N 10

Если вы хотите передать несколько необязательных аргументов, вам следует взглянуть на пакет разбор аргументов.

#!/usr/bin/env python3

import argparse

parser = argparse.ArgumentParser(description='Read head of file.')
parser.add_argument('file', help='Textfile to read')
parser.add_argument('--N', type=int, default=10, help='Number of lines to read')

args = parser.parse_args()
with open(args.file) as myfile:
    head = myfile.readlines()[0:args.N]
print(head)

head = [следующий (мой файл) для x в диапазоне (N)] выдача ошибки> StopIteration

user6882757 24.07.2019 11:04

я также изменил диапазон на xrange

user6882757 24.07.2019 11:07

даже я выполняю файл данных python3.7 file1.py --N 10. все та же ошибка

user6882757 24.07.2019 12:06

Это потому, что [next(myfile) for x in range(N)] не проверяет EOF. Я изменил его на myfile.readlines()[0:args.N]

Simpl 24.07.2019 13:11

Предполагая, что реализованную вами логику print_head не нужно изменять, вот сценарий, который, я думаю, вы ищете:

import sys
from itertools import islice

def print_head(file, n):
    if not file or not n:
        return

    with open(file) as myfile:
        head = [item.strip() for item in islice(myfile, n)]

    print(head)

def parse_args():
    result = {'script': sys.argv[0]}
    args = iter(sys.argv)
    for arg in args:
        if arg == '-F':
            result['filename'] = next(args)

        if arg == '-N':
            result['num_lines'] = int(next(args))

    return result

if __name__ == '__main__':
    script_args = parse_args()
    print_head(script_args.get('filename', ''), script_args.get('num_lines', 0))

Запуск скрипта

python file.py -F datafile -N 10

Примечание. Лучший способ реализовать это — использовать библиотеку argparse.

Ошибка выдачи результата ['имя файла'] = args.next() AttributeError: объект 'list_iterator' не имеет атрибута 'следующий'

user6882757 24.07.2019 13:24

результат ['имя файла'] = args.next() AttributeError: объект 'list_iterator' не имеет атрибута 'следующий'

user6882757 24.07.2019 13:43

@Mous Плохо, код не был совместим с python3. Я исправил это сейчас.

Vignesh Bayari R. 24.07.2019 13:59

head = [next(myfile) for x in range(n)] StopIteration Я также изменил xrange, и из приведенного ниже комментария я узнал, что head не проверяет EOF.

user6882757 24.07.2019 15:46

@Mous Ты прав, как я уже говорил, я не изучал логику головы. Теперь я внес необходимые изменения в свой код.

Vignesh Bayari R. 25.07.2019 08:42

Вы можете получить доступ к аргументу, переданному скрипту через система

sys.argv
The list of command line arguments passed to a Python script. argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string '-c'. If no script name was passed to the Python interpreter, argv[0] is the empty string.

Таким образом, в коде это будет выглядеть так:

import sys

print("All of argv")
print(sys.argv)
print("Last element every time")
print(sys.argv[-1])

Читая документацию, вы увидите, что первые значения, хранящиеся в sys.argv, различаются в зависимости от того, как пользователь вызывает скрипт. Если вы распечатаете код, который я вставил с различными типами вызовов, вы сами увидите, какие значения сохраняются.

Для базового первого подхода: доступ к ннg> через sys.argv[-1], который каждый раз возвращает последний элемент, при условии. Вам все еще нужно выполнить попробуй просить прощения, чтобы убедиться, что переданный аргумент является числом. Для этого у вас будет:

import sys

try:
    n = int(sys.argv[-1])
except ValueError as v_e:
    print(f"Please pass a valid number as argument, not ${sys.argv[-1]}")

Вот и все. Очевидно, это довольно просто, вы можете улучшить это еще больше, если пользователи будут передавать значения с флагами, такими как --пропустить строки 10, и это будет ваш n, и он может быть в любом месте при выполнении скрипта. Я бы создал функцию, отвечающую за перевод sys.argv в словарь ключ, значение для легкого доступа в скрипте.

Другие вопросы по теме