Перейти к конкретной строке в Python?
Обратите внимание, что если вы следуете одному из многих решений, открывающих ваш файл, вы хотите сделать это с помощью блока with (или try / finally в pre-2.5), чтобы обеспечить закрытие файла. Многие из решений могут вызывать исключения, например, если ваш файл неожиданно короче 34 строк.
stackoverflow.com/questions/620367/… python: как перейти к определенной строке в огромном текстовом файле?
7 ответов
Использовать стандартную библиотеку Python linecache модуль:
line = linecache.getline(thefilename, 33)
должен делать именно то, что вы хотите. Вам даже не нужно открывать файл — linecache делает все для вас!
@ghostdog, если «обработка» идет на специально пронумерованных строках, просто продолжайте использовать linecache — как видно из названия, он кеширует вещи для вас. Странный микс, при котором некоторые строки доступны как пронумерованные, а другие нуждаются в зацикливании, может обрабатываться различными способами, но такие странные микшеры вряд ли являются распространенным случаем использования.
@alex, то, что я имею в виду, помимо обработки этих конкретных номеров строк, OP может захотеть использовать и другие строки, возможно, для вывода в некоторые файлы и т. д. и т. д. . Конечно, это не вопрос OP, но только мысль.
Этот код откроет файл, прочитает строку и распечатает ее.
# Open and read file into buffer f = open(file,"r") lines = f.readlines() # If we need to read line 33, and assign it to some variable x = lines[33] print(x)
Решение, которое не будет читать больше файла, чем необходимо,
from itertools import islice line_number = 34 with open(filename) as f: # Adjust index since Python/islice indexes from 0 and the first # line of a file is line 1 line = next(islice(f, line_number - 1, line_number))
line_number = 34 with open(filename) as f: f.readlines()[line_number - 1]
- Прочитайте файл, по очереди, остановитесь, когда вы попали в нужную строку.
- Используйте f.readlines() , который прочитает весь файл в памяти и вернет его как список строк, а затем извлечет 34-й элемент из этого списка.
Решение 1
Преимущество: вы сохраняете в памяти только определенную строку.
for i in xrange(34): line = f.readline(); # when you get here, line will be the 34th line, or None, if there wasn't # enough lines in the file
Решение 2
Преимущества: гораздо меньше кода
Downside: считывает весь файл в память
Проблема: произойдет сбой, если в списке присутствует менее 34 элементов, требуется обработка ошибок
for linenum,line in enumerate(open("file")): if linenum+1==34: print line.rstrip()
не понимаю сколько строк? если ОП хочет остановиться на линии 34, просто сделайте перерыв. Это все же лучше, чем читать весь файл в память.
Вы можете просто прочитать все строки и проиндексировать строку после.
line = open('filename').readlines()[33]
Я рассказал об этом и не получил помощи, поэтому взял материю в свои руки.
import linecache #Simply just importing the linecache function to read our line of choosing number = int(input("Enter a number from 1-10 for a random quote ")) #Asks the user for which number they would like to read(not necessary) lines = linecache.getline("Quotes.txt", number) #Create a new variable in order to grab the specific line, the variable #integer can be replaced by any integer of your choosing. print(lines) #This will print the line of your choosing.
Если вы завершили это в python, убедитесь, что у вас есть оба файла (.py) и (.txt) в том же месте, иначе python не сможет получить это, если вы не укажете местоположение файла. НАПРИМЕР.
Это используется, когда файл находится в другой папке, чем файл .py, который вы используете.
Как сделать возврат в коде к определённому моменту?
Привет! Вопрос из разряда «Для чайников». Мне нужно сделать возврат к строке в начале кода. Допустим у меня есть условный оператор, при невыполнении условия которого мне нужно вернуться к началу программы или к предыдущему шагу. Как мне это сделать?
Простой 1 комментарий
есть несколько реализаций goto для python. можно заменить конструкцией
while True: . continue # это переход в начало . break
но проблема этой (и подобной) конструкций — выход из вложенных циклов
альтернатива — использовать try except
answer = 0 print('Здравствуйте! Вы открыли текстовый квест. Чтобы начать его, нажмите Enter') input() print('Перед началом квеста вы должны узнать, как нужно отвечать на вопросы.') print('На вопросы нужно отвечать строго числами, которые указаны перед вариантами ответов!') print('Начинаем! Приятной игры!') while True: print('Вы очнулись на корабле. Вокруг ни души. Нужно осмотреться. Здесь есть 3 прохода.') print('1)Прямо по коридору') print('2)По коридору налево') print('3)Зайти в каюту') answer = input() if answer == 1: print('Здесь ещё одна развилка. Есть три прохода. Выбирайте') print('1)Пройти в дверь прямо') print('2)Пройти направо по коридору') print('3)Повернуть налево и открыть тяжёлую дверь')
not_success = True while (not_success):
answer = 0 print('Здравствуйте! Вы открыли текстовый квест. Чтобы начать его, нажмите Enter') input() print('Перед началом квеста вы должны узнать, как нужно отвечать на вопросы.') print('На вопросы нужно отвечать строго числами, которые указаны перед вариантами ответов!') print('Начинаем! Приятной игры!') while answer != 5: print('Вы очнулись на корабле. Вокруг ни души. Нужно осмотреться. Здесь есть 3 прохода.') print('1)Прямо по коридору') print('2)По коридору налево') print('3)Зайти в каюту') answer = input() if answer == 1: print('Здесь ещё одна развилка. Есть три прохода. Выбирайте') print('1)Пройти в дверь прямо') print('2)Пройти направо по коридору') print('3)Повернуть налево и открыть тяжёлую дверь') answer = input()
Вы так и собрались писать всю программу в одну линию? В результате код будет на 90% состоять из отступов.
Вам нужно один раз сохранить все эти блоки строк в плоском массиве и определять по каждому ответу, к какому (номеру) перейти следующим шагом.
Раз уж взялись реализовывать книжку-квест, так и следуйте ее логике: на стр. N есть вот такой текст и варианты перехода: на стр. L, M и K.
Adamos, дело в том, что о массивах я ничего ещё не знаю. Я учу Python не так давно, а этот квест — просто задание из программы обучения.
sylniyduxom, ну, вот вам и причина поизучать массивы.
Приведенный вами спагетти-код ничему хорошему вас не научит.
Adamos, ладно, спасибо! Я поищу кое-что в интернете. Просто программа обучения требует чтобы я учился строго всему в своё время.
sylniyduxom, ну, теперь можно переходить к симулятору противостояния Внутренних Планет и Внешних Спутников:
[
[‘Земля’, ‘Венера’, ‘Марс’, ‘Меркурий’],
[‘Ганимед’, ‘Титан’, ‘Каллисто’, ‘Альматея’]
]
%)
Как вернуться на определённую строку в коде? python
Как вернуться на определённую строку кода и чтобы при этом не завершался цикл. Без def.
Ответы (2 шт):
Питон высоко структурированный язык, без возможности просто обозначить какую-то команду для прыжка в ее с другой части программы.
Это сделано сознательно, чтобы такой возможности не было.
Когда вам это нужно, вам приходит подумать, если вам ясно, что от вашей программы ожидаете. Впервые стратегия, и только после ней тактика.
Например вы при каком-то условии хотите повторить часть с команды print(«2») :
while True: print("1") time.sleep(1) something = True while something: print("2") time.sleep(1) print("3") time.sleep(1) if something_other: something = False # Окончание внутреннего цикла
(Команда continue в вашем коде излишня.)
Аналог goto ? Да действительно, встроенных инструментов, полностью реализующих функционал goto , нет (почему так сделано — отдельный вопрос). Однако есть огромное количество идиом, позволяющих частично или полностью эмулировать это.
Есть и другие варианты, более специфичные. Также всегда есть возможность именовать одинаковые участки кода с помощью функций.
Если все-таки нужно написать именно аналог goto , то вот варианты:
- написать функцию, меняющую байткод функции с goto (а конкретно, добавляющую где надо opcode JUMP_ABSOLUTE );
- написать свою кодировку с goto , ассоциированный декодер, зарегистрировать его, и писать в начале скрипта #*- coding: my_goto_codec -*- ;
- написать функцию, наподобие exec , реализующую анализ инструкций вручную.
Как видите, гораздо проще пользоваться встроенными средствами, нежели городить трёхэтажные велосипеды с сомнительной полезностью. Лично я знаю только одну проблему, которую достаточно трудно решить подручными средствами в питоне — break из всех вложенных циклов в самое начало. Пожалуй, это единственное место, где goto был бы полезен.
Как вернуть каретку на предыдущую строку?
Пример кода, в первом случае все заменяется корректно, но во втором не так как хотелось бы из-за символа новой строки. Как это можно обойти?
import time as t print('-----',end='') t.sleep(1) print('\r++++++') print('-----\n',end='') t.sleep(1) print('''\r++++++''')
Ну а если точнее то мне нужно заменить подобное
aaaaaaaa bbbbbbbbb
aaaaaaaa -> bbbbbbbbb
aaaaaaaa bbbbbbbbb
Около такого
Средний 16 комментариев
RINCODE, мне нужно вывести текст через принт, а потом изменить его, это делается с помощью /r — передвижении каретки, я скинул пример как это работает. Меня интересует как использовать этот же метод метод но заменить не одну строку, а сразу несколько, которые разделены /n.
RINCODE, текст который мне нужно вывести а потом изменить уже заготовлен, по структуре это :
Я читал, что можно и полностью очищать экран, а потом опять выводить, но это не то что нужно.
RINCODE, это в принципе проблему решает, но не тем способом, я хотел бы сделать через \r, а не очисткой экрана, если это возможно конечно
KugekiSoto, И я думаю, это то, что вы хотели сделать
RINCODE, справедливо, я имел ввиду что там после \n еще символы то есть многострочный вывод, который нужно заменить
while (True): print('---\n|||\n---', end='') time.sleep(5) print('\n\r++++++')
RINCODE, нет, я запустил этот код и вот результат:
А нужно что бы оно также чередовалось, но постоянно мы видили только одно, типа вот так:
а потом
и так по циклу
KugekiSoto, Тогда честно не знаю как, пользуйтесь очисткой консоли и если я правильно понял из документации берется последняя строка, т.е. нельзя взять предыдущую