【问题标题】:For each line "for loop" cant implement in my script对于我的脚本中无法实现的每一行“for循环”
【发布时间】:2020-06-17 23:33:44
【问题描述】:

我对 Python 完全陌生,目前我正在努力为大多数人提供一个“简单”的步骤。

我的目标是将行从一个源文件复制并粘贴到目标文件。 但。目标文件应保留其前 12 行。在 12 行之后,它应该从源文件中获取所有行。到目前为止效果很好。我只需要为最后一部分设置线条。

所以我必须在目标文件中为你找到的每一行添加一个循环,就像 " 替换它)

config_fstab = '# /etc/fstab: static file system information.'
einhaengepunkte_replace = '#Eigene_Einhaengepunkte'

with open(r'C:\Users\sample\Desktop\SCRIPTING02.txt') as input_header_stays:
    with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt','w') as zwischenspeicher:
        zeilen = input_header_stays.readlines()
        for i, line in enumerate(zeilen):
            if line.startswith(config_fstab):
                zwischenspeicher.write(line)
                zwischenspeicher.write(zeilen[i + 1])
                zwischenspeicher.write(zeilen[i + 2])
                zwischenspeicher.write(zeilen[i + 3])
                zwischenspeicher.write(zeilen[i + 4])
                zwischenspeicher.write(zeilen[i + 5])
                zwischenspeicher.write(zeilen[i + 6])
                zwischenspeicher.write(zeilen[i + 7])
                zwischenspeicher.write(zeilen[i + 8])
                zwischenspeicher.write(zeilen[i + 9])
                zwischenspeicher.write(zeilen[i + 10])
                zwischenspeicher.write(zeilen[i + 11])
                zwischenspeicher.write(zeilen[i + 12])
input_header_stays.close()
zwischenspeicher.close()

with open(r'C:\Users\sample\Desktop\SCRIPTING.txt') as input_scripting_fstab:
    with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt','a') as zwischenspeicher:
        zeilen = input_scripting_fstab.readlines()
        for i, line in enumerate(zeilen):
            if line.startswith(einhaengepunkte_replace):
                zwischenspeicher.write(line)
                zwischenspeicher.write(zeilen[i + 1])
                zwischenspeicher.write(zeilen[i + 2])
                zwischenspeicher.write(zeilen[i + 3])
                zwischenspeicher.write(zeilen[i + 4])
                zwischenspeicher.write(zeilen[i + 5])
                zwischenspeicher.write(zeilen[i + 6])
                zwischenspeicher.write(zeilen[i + 7])
                zwischenspeicher.write(zeilen[i + 8])
                zwischenspeicher.write(zeilen[i + 9])
                zwischenspeicher.write(zeilen[i + 10])
                zwischenspeicher.write(zeilen[i + 11])
                zwischenspeicher.write(zeilen[i + 12])
                zwischenspeicher.write(zeilen[i + 13])
                zwischenspeicher.write(zeilen[i + 14])
                zwischenspeicher.write(zeilen[i + 15])
                zwischenspeicher.write(zeilen[i + 16])

input_scripting_fstab.close()
zwischenspeicher.close()

这是我的代码。

我认为我需要帮助的棘手部分是这个:

with open(r'C:\Users\sample\Desktop\SCRIPTING.txt') as input_scripting_fstab:
    with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt','a') as zwischenspeicher:
        zeilen = input_scripting_fstab.readlines()
        for i, line in enumerate(zeilen):
            if line.startswith(einhaengepunkte_replace):
                zwischenspeicher.write(line)
                zwischenspeicher.write(zeilen[i + 1])
                zwischenspeicher.write(zeilen[i + 2])
                zwischenspeicher.write(zeilen[i + 3])
                zwischenspeicher.write(zeilen[i + 4])
                zwischenspeicher.write(zeilen[i + 5])
                zwischenspeicher.write(zeilen[i + 6])
                zwischenspeicher.write(zeilen[i + 7])
                zwischenspeicher.write(zeilen[i + 8])
                zwischenspeicher.write(zeilen[i + 9])
                zwischenspeicher.write(zeilen[i + 10])
                zwischenspeicher.write(zeilen[i + 11])
                zwischenspeicher.write(zeilen[i + 12])
                zwischenspeicher.write(zeilen[i + 13])
                zwischenspeicher.write(zeilen[i + 14])
                zwischenspeicher.write(zeilen[i + 15])
                zwischenspeicher.write(zeilen[i + 16])

台词越来越多,我一个人插不进去。这就是我的 Python 脚本需要大脑的地方。

【问题讨论】:

  • 您无需执行file.close(),因为您已经在使用with open("...") as file:。这会在您取消缩进后自动关闭文件。
  • 谢谢。我删除了。

标签: python-3.x loops for-loop replace line


【解决方案1】:

如果您只想在某个点之后复制到文件末尾,则不需要枚举。


einhaengepunkte_replace = '#Eigene_Einhaengepunkte'

with open(r'C:\Users\sample\Desktop\SCRIPTING.txt', 'r') as input_scripting_fstab:
    zeilen = input_scripting_fstab.readlines()

with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt', 'a') as zwischenspeicher:
    writing = False
    for line in zeilen:
        # This flag just tells us when to start writing
        if line.startswith(einhaengepunkte_replace):
            writing = True

        if writing:
            zwischenspeicher.write(line)

既然你有一个模式,你甚至可以把它扔到一个函数中。

def copy_it(source='', destination='', start_point='', mode='a'):
    with open(source, 'r') as source_file:
        source_lines = source_file.readlines()

    with open(destination, mode) as dest_file:
        writing = False
        for line in source_lines:
            if line.startswith(start_point):
                writing = True

            if writing:
                dest_file.write(line)


copy_it(source=r'C:\Users\sample\Desktop\SCRIPTING.txt',
        destination=r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt',
        start_point='#Eigene_Einhaengepunkte')

copy_it(source=r'C:\Users\sample\Desktop\SCRIPTING02.txt',
        destination=r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt',
        start_point='# /etc/fstab: static file system information.',
        mode='w')

【讨论】:

  • write(line) 不是 write(zeilen) ;)
  • 这太棒了。太感谢了。初学者很难理解一切。但是我现在将逐行学习您的代码。非常感谢!
【解决方案2】:

您只需要一个循环来编写所需的行数。

lines_to_copy = 16

with open(r'C:\Users\sample\Desktop\SCRIPTING.txt', 'r') as input_scripting_fstab:
    zeilen = input_scripting_fstab.readlines()

with open(r'C:\Users\sample\Desktop\ZWISCHENSPEICHER.txt', 'a') as zwischenspeicher:
    for i, line in enumerate(zeilen):
        if line.startswith(einhaengepunkte_replace):
            for n in range(lines_to_copy): # Copy the next 16 lines.
                zwischenspeicher.write(zeilen[i + n]) # <---  

【讨论】:

  • 谢谢。这将使我的脚本更小。但是问题我还没有解决。生病必须设置“数字16”。如果我的源文件变得不适,则必须编辑我的脚本。有没有办法“lines_to_copy”填充自己?先读取行,然后编辑变量中的数字?
  • 是的,我们会找到一种方法让它自己填满。我们只需要知道,值 16 是从哪里来的?
  • 文件结束 :) 我猜我们可以搜索“\n”
  • 然后我们可以使用len(zeilen) - 12 而不是硬编码的16。 @Axe319 的解决方案非常好,因为它完全摆脱了 enumerate :)
  • 没错。谢谢你的帮助。不错的社区。 :)
猜你喜欢
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-08-27
  • 2011-08-03
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
相关资源
最近更新 更多