Неполадка при чтении 1-й строки без комментариев сразу после использования функции dropdown для пропуска строк с комментариями - PullRequest
1 голос
/ 23 октября 2019

Мне нужно прочитать несколько файлов .dat и извлечь из них соответствующую информацию.

Файлы .dat обычно начинаются примерно с 15-25 строк комментариев (строка начинается с «#»), затем следующие две строки - это числа, которые указывают на их природу и размер. Однако, как только я пытаюсь прочитать первую строку без комментариев, мой код начинает читать со второй строки без комментариев. Кажется, я не могу понять, в чем проблема: / Любая помощь будет высоко ценится, поскольку это мешает мне выполнять другие более сложные операции с этими файлами .dat.

Вот мой некорректный код:

PS: Если есть более питонический способ, пожалуйста, дайте мне знать:)

#Packages needed
from itertools import dropwhile

# In[]
#defining function to check if line starts with some character, here #
def is_comment(s):
    # return true if a line starts with #
    return s.startswith('#')

# In[]
file = "foo.dat"   

#viewing important info
with open(file, "r") as f:
    for line in dropwhile(is_comment, f):           

        Nat = f.readline()
        print("Nature:", Nat)

        S = f.readline()
        print("Size, S:", S)

        break

Пожалуйста, найдите прикрепленный скриншот foo.dat файл в вопросе. foo.dat Или текстовая версия здесь: https://pastebin.com/C91dpUXK
* Редактировать: добавлена ​​ссылка на текстовый файл

Ответы [ 3 ]

1 голос
/ 23 октября 2019

ожидается

При первом входе в цикл line - первая строка без комментариев. Вы пропускаете это, читая другую строку немедленно. Быстрое исправление было бы для использования line:

for line in dropwhile(is_comment, f):           
    Nat = line
    print("Nature:", Nat)

    S = f.readline()
    print("Size, S:", S)

Более питонским способом была бы ручная итерация.

d = dropwhile(is_comment, f)
nat = next(d)
size = next(d)
1 голос
/ 23 октября 2019

Вот как вы можете извлечь строки, которые не пусты или оставить комментарий (начинаются с #):

with open('foo.dat') as f:
    no_comment_lines = [l.strip() for l in f.readlines() 
                        if l.strip() and not l.startswith('#')]
for l in no_comment_lines:
    print(l)
1 голос
/ 23 октября 2019

Ниже (при условии, что вам нужны все строки файла)

with open('foo.dat') as f:
    lines = [l.strip() for l in f.readlines() if l[0] != '#']
    print(lines[0])
    print(lines[1])
    for line in lines[2:]:
        fields = [f for f in line.split(' ') if len(f)]
        print(fields)
...