Как сжать этот код при записи в разные каталоги? - PullRequest
0 голосов
/ 28 января 2020

Python новичок здесь пытается узнать, как сделать мой код более упорядоченным. Извините заранее за длинный вопрос, я не знаю, сколько информации вам нужно, чтобы помочь мне.

У меня есть кусок кода, который делает именно то, что мне нужно, но я чувствую, что он должен быть более компактным.

В основном мой код принимает файл, умножает одно число, затем пишет файл в другой каталог каждый раз, когда он проходит через код.

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

Есть ли способ сжать этот код? Код должен взять 0-й индекс и записать в FileLocation1. Затем возьмите 1-й индекс и запишите в FileLocation2. Вероятно, это вопрос использования для l oop, но я не знаю, где его поставить: (

Код выглядит следующим образом:

#Identifying path where the file is that I want to multiply
path = 'C:\\DirectoryIWantToTakeFileFrom'

#Define the multipliers in the list below
multipliers = [0.01, 0.1, 0.25, 0.5, 1, 1.5, 1.7, 1.85, 2]
all_data0 = []
with open(path, 'r') as file_handler:
    for multiplier in multipliers:
        for line in file_handler.readlines():
            if line.strip():
                each_line_data = line.split()
                old_debiet = each_line_data[-3]
                new_debiet = float(old_debiet) * multipliers[0]
                each_line_data[-3] = str(new_debiet)
                new_each_line_data = ' '.join(each_line_data)
                all_data0.append(new_each_line_data)

with open('C:\\WriteLocation1', 'w') as file_handler:
    for item in all_data0:
        file_handler.write("{}\n".format(item))

#Now I proceed to execute exactly the same code but I store the data in a different list (all_data1) and I change the writing directory
all_data1 = []
with open(path, 'r') as file_handler:
    for multiplier in multipliers:
        for line in file_handler.readlines():
            if line.strip():
                each_line_data = line.split()
                old_debiet = each_line_data[-3]
                new_debiet = float(old_debiet) * multipliers[1]
                each_line_data[-3] = str(new_debiet)
                new_each_line_data = ' '.join(each_line_data)
                all_data1.append(new_each_line_data)

with open('C:\\WriteLocation2', 'w') as file_handler:
    for item in all_data1:
        file_handler.write("{}\n".format(item))

#And now I do this 7 more times, for WriteLocation3, 4, 5, 6, 7, 8 and 9.

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Первое, что мы можем сделать, - это извлечь общий код как функцию. Аргументами функции будут переменные, которые меняются в каждом, скажем, цикле умножения . В вашем примере весь код повторяется за исключением строк new_debiet = float(old_debiet) * multipliers[0] и with open('C:\\WriteLocation1', 'w') as file_handler:. Так что это могут быть аргументы функции.

Теперь давайте определим функцию. Определение может выглядеть следующим образом:

def multiply_and_write(multiplier, file_to_write):
    all_data0 = []
    with open(path, 'r') as file_handler:
        for multiplier in multipliers:
            for line in file_handler.readlines():
                if line.strip():
                    each_line_data = line.split()
                    old_debiet = each_line_data[-3]
                    new_debiet = float(old_debiet) * multiplier
                    each_line_data[-3] = str(new_debiet)
                    new_each_line_data = ' '.join(each_line_data)
                    all_data0.append(new_each_line_data)

    with open(file_to_write, 'w') as file_handler:
        for item in all_data0:
            file_handler.write("{}\n".format(item))

Обратите внимание на изменение строк, указанных выше.

Теперь мы будем вызывать эту функцию для каждого множителя и для каждого местоположения файла. Давайте предположим, что у нас есть список множителей и местоположений файлов:

multipliers = [0.01, 0.1, 0.25, 0.5, 1, 1.5, 1.7, 1.85, 2] # length of both lists is assumed to be the same
file_locations = ['C:\\WriteLocation1', 'C:\\WriteLocation2', ...]

Теперь мы перебираем эти списки и вызываем функцию, которую мы определили ранее, как:

for i in range(len(multipliers)):
    multiply_and_write(multipliers[i], file_locations[i])

Надеюсь, что это помогает!

PS: может быть еще несколько настроек для повышения эффективности кода. Тем не менее, я хотел бы сказать, что использование функции поможет сократить объем кода.

0 голосов
/ 28 января 2020

Поместите каждую строку пути в список, а затем l oop список:)

Так что-то вроде этого:

list_of_write_locations = ['C:\\WriteLocation1', 'C:\\Writelocation2', ... ]

for location in list_of_write_locations:
   with open(location, 'w') as file_handler:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...