Да, вы можете использовать метод str.endswith()
для проверки трейлинга строк.
with open('e.txt') as f:
for line in f:
if not line.endswith(('nope', 'nope\n')):
start, target = line.split()
alist.append([int(start), int(target)])
Обратите внимание, что при использовании оператора with
для открытия файла выне нужно явно закрывать файл, файл будет автоматически закрыт в конце блока.
Еще один, но более оптимизированный подход для решения этой проблемы - использовать понимание списка, чтобы отказаться от добавления в список.на каждой итерации и получайте выгоду от ее производительности по сравнению с обычным циклом.
with open('e.txt') as f:
alist = [tuple(int(n) for i in line.split()) for line in f if not line.endswith(('nope', 'nope\n'))]
Обратите внимание, что все же, поскольку ваш код подвержен исключениям из-за преобразования строк в целочисленные и разделения строк и т. д. Лучше использоватьПопробуйте, за исключением случаев, когда ваш код может исключить возможные исключения и обработать их должным образом.
with open('e.txt') as f:
for line in f:
if not line.endswith(('nope', 'nope\n')):
try:
start, target = line.split()
except ValueError:
# the line.split() returns more or less than two items
pass # or do smth else
try:
alist.append([int(start), int(target)])
except ValueError:
# invalid literal for int() with base 10
pass # or do smth else
Другой и все же подход Pythonic заключается в использовании модуля csv
для чтения файла.В этом случае вам не нужно разбивать строки и / или использовать str.endswith()
.
import csv
with open("e.txt") as f:
reader = csv.reader(f, delimiter=' ')
alist = [(int(i), int(j)) for i, j, *rest in reader if not rest[0]]
# rest[0] can be either an empty string or the word 'nope' if it's
# an empty string we want the numbers.