Как мне получить первые 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))
Я написал программу, может дайте мне знать лучше, чем этот код
Ваш код точно такой же, как ответ здесь: stackoverflow.com/questions/1767513/… Мне было интересно, в чем проблема.
У меня отлично работает. Да как привести аргумент с Н.
Имейте в виду, что sys.argv[0] — это имя вашего скрипта. sys.argv[1] — первый аргумент.






Аргументы доступны через пакет 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
я также изменил диапазон на xrange
даже я выполняю файл данных python3.7 file1.py --N 10. все та же ошибка
Это потому, что [next(myfile) for x in range(N)] не проверяет EOF. Я изменил его на myfile.readlines()[0:args.N]
Предполагая, что реализованную вами логику 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' не имеет атрибута 'следующий'
результат ['имя файла'] = args.next() AttributeError: объект 'list_iterator' не имеет атрибута 'следующий'
@Mous Плохо, код не был совместим с python3. Я исправил это сейчас.
head = [next(myfile) for x in range(n)] StopIteration Я также изменил xrange, и из приведенного ниже комментария я узнал, что head не проверяет EOF.
@Mous Ты прав, как я уже говорил, я не изучал логику головы. Теперь я внес необходимые изменения в свой код.
Вы можете получить доступ к аргументу, переданному скрипту через система
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, различаются в зависимости от того, как пользователь вызывает скрипт. Если вы распечатаете код, который я вставил с различными типами вызовов, вы сами увидите, какие значения сохраняются.
Для базового первого подхода: доступ к
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 в словарь ключ, значение для легкого доступа в скрипте.
какую ошибку/вывод вы получили?