为了账号安全,请及时绑定邮箱和手机立即绑定

如何在仍然写入不同目录的同时压缩此代码?

如何在仍然写入不同目录的同时压缩此代码?

慕后森 2022-07-12 14:40:50
Python初学者在这里尝试学习如何使我的代码更加精简。很抱歉这个问题很长,我不知道你们需要多少信息才能帮助我。我有一段代码完全符合我的需要,但我觉得它应该更紧凑。基本上我的代码需要一个文件,乘以一个数字,然后每次运行代码时将文件写入不同的目录。为了让代码做我想做的事,我基本上必须重复代码 9x(乘数列表中的每个项目一次),因为我希望每次都将结果写入不同的目录。有没有办法压缩这段代码?代码应采用第 0 个索引并写入 FileLocation1。然后取第一个索引并写入 FileLocation2。这可能是使用 for 循环的问题,但我不知道把它放在哪里:(代码如下:#Identifying path where the file is that I want to multiplypath = 'C:\\DirectoryIWantToTakeFileFrom'#Define the multipliers in the list belowmultipliers = [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 directoryall_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 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我们可以做的第一件事就是将公共代码提取为函数。该函数的参数将是在每个假设中发生变化的变量 -乘法循环。在您的示例中,除了行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:在提高代码效率方面可能会有更多的调整。但是,我想传达的一点是使用函数将有助于减少代码。


查看完整回答
反对 回复 2022-07-12
?
守着一只汪

TA贡献1872条经验 获得超3个赞

将每个路径字符串放在一个列表中,然后循环该列表:)


所以是这样的:


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


for location in list_of_write_locations:

   with open(location, 'w') as file_handler:


查看完整回答
反对 回复 2022-07-12
  • 2 回答
  • 0 关注
  • 62 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信