Python: если len (список) дает разные результаты в разных обстоятельствах? - PullRequest
0 голосов
/ 01 июня 2018

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

Я хочу, чтобы код игнорировал строки, которые являются только пробелами (таким образом, пользователь может сделать свой файл по крайней мере видудобочитаемым без объединения всех строк друг с другом), но я не могу понять, как это сделать.Я попытался сделать это

with open(path, "r") as infile:
    for row in infile:
        if len(row):
            srclines.append(row.split())

И это работает , поскольку создание списка строк и разделение каждого слова идет, НО все еще добавляет пустые строки, которые являются только пробелами.Я подтвердил это, выполнив это

for entry in srclines:
    print entry

Что дает, например,

['This', 'is']
[]
['A', 'test']

С исходным текстом

This is

A test

Но странно, если во времяна этапе печати я делаю еще одну проверку len (), тогда пустые строки на самом деле игнорируются так, как я хочу, и это выглядит так

['This', 'is']
['A', 'test']

В чем причина этого?Означает ли это, что я могу только просматривать список и удалять пустые записи после его создания?Или я просто делаю код импорта строки неправильно?Я использую Python 3.6 для тестирования этого кода с помощью

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Попробуйте создать список понимания :

with open('d.txt', "r") as infile:
    print([i.strip().split() for i in infile if i.strip()])

Вывод:

[['This', 'is'], ['A', 'test']]
0 голосов
/ 01 июня 2018

testdoc.txt содержит много пустых строк;но на выходе они отсутствуют;

src = 'testdoc.txt'
with open(src, 'r') as f:
    for r in f:
        if len(r) > 1:
            print(r.strip())

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

0 голосов
/ 01 июня 2018

row содержит символ новой строки, поэтому он не пустой.Но row.split() не находит никаких непробельных символов, поэтому возвращает пустой список.

Используйте

if len(row.strip()):

, чтобы игнорировать символ новой строки (и любые другие начальные / конечные пробелы).

Или проще:

if row.strip():

, поскольку пустая строка ложная.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...