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