如何创建在python3中删除多个列范围的文件副本

如何创建在python3中删除多个列范围的文件副本,python,python-3.x,range,cut,Python,Python 3.x,Range,Cut,我想复制一个带有固定宽度记录且删除了多个数字范围的文件。例如,一个文件有1600长的固定宽度记录,我想保持列0-83、89-1517、1526结束。这是为了解决更大的问题,像cut和awk这样的独立实用程序在这里没有帮助 我拥有适用于每一行/记录的信息;它工作正常,不知道是否有明显更好的 "".join([full[:84], full[89:1518], full[1526:]]) 特别是,我会发现,如果有标准库或更像的易读快速函数,指定要剪切的内容比保留的内容更自然

我想复制一个带有固定宽度记录且删除了多个数字范围的文件。例如,一个文件有1600长的固定宽度记录,我想保持列0-83、89-1517、1526结束。这是为了解决更大的问题,像cut和awk这样的独立实用程序在这里没有帮助

我拥有适用于每一行/记录的信息;它工作正常,不知道是否有明显更好的

"".join([full[:84], full[89:1518], full[1526:]])
特别是,我会发现,如果有标准库或更像的易读快速函数,指定要剪切的内容比保留的内容更自然

 # hypothetical
 cut(line, [ [84,88], [1519, 25] ])
添加

若要接受答案,请使用已排序的切割列表,以便调用方可以按任意顺序给出。最好也添加重叠检测

def cut(line, cuts):
    sorted_cuts = sorted(cuts, key=lambda x: x[0])
    
    return ''.join(line[slice(keep_start, keep_end)]
                   for keep_start, keep_end in zip(
                           [None] + [cut_end for cut_start, cut_end in sorted_cuts],
                           [cut_start for cut_start, cut_end in sorted_cuts] + [None]))


origline = "0123456789"

assert (cut(origline, [[1,2], [3,4]]) ==
        cut(origline, ([3,4], (1,2))) ==
        cut(origline, [[3,4], [1,2]]))

print(cut(origline, [[1,2], [3,4]]))

下面是假设的
cut
函数的实现

def cut(line, cuts):
    
    return ''.join(line[slice(keep_start, keep_end)]
                   for keep_start, keep_end in zip(
                           [None] + [cut_end for cut_start, cut_end in cuts],
                           [cut_start for cut_start, cut_end in cuts] + [None]))

print(cut('abcdefghijklmnopqrstuvwxyz', [[1,3], [9,10]]))
给出:

adefghiklmnopqrstuvwxyz
bc
j
被切割)

因此:

  • 要保留的切片从第一次切割的开始到开始
  • 要保留的切片从第一次切割的结束到第二次切割的开始
  • 要保留的最后一个切片从最后一个切割的末端到字符串的末端
[None]+[cut\u end for cut\u start,cut\u end in cuts]
是要保留的每个切片的开始,在本例中
[None,3,10]

[cut\u start for cut\u start,cut\u end in cuts]+[None]
是要保留的每个切片的末尾,在本例中
[1,9,None]

其中
None
表示
切片所使用的字符串的开始/结束



注意:要实现示例中给出的切割,您可以将参数提供给此
cut
函数,如下所示:

 cut(line, [[84, 89], [1519, 1526]])
其中,每个2元素列表的第二个元素是剪切结束后的索引,这与常规python索引约定一致

如果您真的不想这样做(为了准确地获得您上面描述的
cut
功能),那么在上面的代码中您将替换:

[cut_end for cut_start, cut_end in cuts]
与:

为方便起见,下面是在这种情况下函数的完整代码,以及您将在示例中使用的调用代码:

def cut(line, cuts):
    
    return ''.join(line[slice(keep_start, keep_end)]
                   for keep_start, keep_end in zip(
                           [None] + [cut_end + 1 for cut_start, cut_end in cuts],
                           [cut_start for cut_start, cut_end in cuts] + [None]))

print(cut(line, [[84, 88], [1519, 1525]])

如果它们是一个列表,你可以像上面那样索引,但是使用del谢谢,这很好。认可的。我的贡献附在原来的帖子后,允许以任何顺序进行削减。
def cut(line, cuts):
    
    return ''.join(line[slice(keep_start, keep_end)]
                   for keep_start, keep_end in zip(
                           [None] + [cut_end + 1 for cut_start, cut_end in cuts],
                           [cut_start for cut_start, cut_end in cuts] + [None]))

print(cut(line, [[84, 88], [1519, 1525]])