Метод Readlines в Python пропускает первую строку в файле после заголовка - PullRequest
0 голосов
/ 04 февраля 2019
filename = os.path.abspath(r'C:\x\y\Any.ini') #Using absolute path
file = (open(filename, 'r', encoding='UTF-8'))
for line in file:
    if ("Heading A") in line:
        for line in file:
            out = file.readlines()[1:]
                    print(out)

Внутри файла структура имеет вид

[Heading A] #I don't want to read 
a[0]    # Not being read although i want to
a[1]    # Starts to be read in the program
b 
c

Я также пытался использовать

file.read().splitlines()

Теперь я получаю отпечатки из [1].[0] всегда пропускается.

Есть что-то, что я пропускаю, чтобы продолжить чтение со 2-й строки файла

Ответы [ 5 ]

0 голосов
/ 04 февраля 2019

Это связано с тем, что указатель чтения (или конкретная позиция потока) продвигается по мере итерации по файлу.В вашем случае ответственность за это несут две петли for.Когда вы вызываете readlines() во втором цикле, он перебирает только оставшиеся строки в файле и, следовательно, выглядит так, как будто пропускает строки.

Поскольку вы хотите прочитать строки после 'Заголовка A',Вы можете просто прочитать все строки, как только столкнетесь с этим.Код для того же должен выглядеть примерно так:

filename = os.path.abspath(r'C:\x\y\Any.ini')
file = (open(filename, 'r', encoding='UTF-8'))
for line in file:
    if ("Heading A") in line:
        out = file.readlines()[
        print(out)
0 голосов
/ 04 февраля 2019

Чтобы добавить некоторые объяснения:

Чтобы прочитать файл построчно, см. здесь .

Ваша проблема в том, что вы используете несколько вызовов, каждый из которых читает одинили несколько строк из файла, и эта строка пропущена для следующего вызова чтения - см. мои комментарии в коде:

for line in file: // reads the first line and would read again if we came back here before the end of the file, which we do not
if ("Heading A") in line:
    for line in file: // reads the second line of the file and would read again if we came back here before the end of the file, which we do not
        out = file.readlines()[1:] // reads all remaining lines from the file ( beginning from the third) and drops the first (line three in the file) by indexing [1:]
                print(out) // prints out all lines begining with the fourth; after this, the file is at its and and both for loops will be finished

Что вы хотите сделать, это читать построчно и отбрасывать содержимое, содержащее Heading A:

filename = os.path.abspath(r'C:\x\y\Any.ini') #Using absolute path
file = (open(filename, 'r', encoding='UTF-8'))
for line in file:
    if not ("Heading A") in line: print (line)
0 голосов
/ 04 февраля 2019

попробуйте это:

firstLine = file.readline()
    if firstLine.startsWith("[Heading A]"):
        for line in file:
            //code
0 голосов
/ 04 февраля 2019

Может работать следующее.

filename = os.path.abspath(r'C:\x\y\Any.ini') #Using absolute path
file_lines = open(filename, 'r', encoding='UTF-8').readlines()[1:]
for line in file_lines:
    print(line)
0 голосов
/ 04 февраля 2019

У вас есть нормальный файл конфигурации.Прочитайте следующее:

https://docs.python.org/3/library/configparser.html
...