Если у вас есть файл с именем parameters.txt
с данными
foo
bar
foobar
и функцией
def my_function(some_text):
print("I was called with " + some_text)
Затем вы можете сделать это, чтобы передать каждую строку файла функции:
with open('parameters.txt', 'r') as my_file:
for line in my_file:
# remove the # and space from the next line to enable output to console:
# print(line.rstrip())
my_function(line.rstrip())
Обратите внимание, что метод rstrip()
во всех моих примерах удаляет завершающий символ новой строки (а также другие конечные пробелы), который в противном случае был бы частью каждой строки.
Еслиу вашего файла параметров есть заголовок, как в вашем примере, у вас есть несколько возможностей пропустить это.
Например, вы можете прочитать все строки сразу в списке и затем выполнить итерации по подмножеству:
with open('parameters.txt', 'r') as my_file:
all_lines = [line.rstrip() for line in my_file.readlines()]
# print(all_lines)
for line in all_lines[1:]:
# print(line)
my_function(line)
Однако, это просто проигнорирует заголовок.Если вы случайно передали неправильный файл или файл с недопустимым содержимым, это может вызвать проблемы.
Лучше проверить, правильно ли указан заголовок файла.Вы можете просто развернуть код сверху:
with open('parameters.txt', 'r') as my_file:
all_lines = [line.rstrip() for line in my_file.readlines()]
# print(all_lines)
if all_lines[0] != 'COM_PORTS':
raise RuntimeError("file has wrong header")
for line in all_lines[1:]:
# print(line)
my_function(line)
Или вы можете сделать это внутри цикла, например:
expect_header = True
with open('parameters.txt', 'r') as my_file:
for line in my_file:
stripped = line.rstrip()
if expect_header:
if stripped != 'COM_PORTS':
raise RuntimeError("header of file is wrong")
expect_header = False
continue
# print(stripped)
my_function(stripped)
Или вы можете использовать выражение генератора для проверки заголовкавне цикла:
with open('parameters.txt', 'r') as my_file:
all_lines = (line.rstrip() for line in my_file.readlines())
if next(all_lines) != 'COM_PORTS':
raise RuntimeError("file has wrong header")
for line in all_lines:
# print(line)
my_function(line)
Я бы предпочел этот последний, так как он имеет четкую структуру и не содержит магических чисел (таких как 0
и 1
, ссылаясь на то, какая строка являетсязаголовок и количество пропускаемых файлов соответственно), и не требуется считывать все строки в памяти сразу.
Однако решение, приведенное выше, которое считывает все строки в списке одновременно, вероятно, будет лучше, если выВы хотите продолжить их обработку, поскольку в этом случае данные уже доступны, и вам больше не нужно читать файл.