【问题标题】:Most efficiently removing the n-th row of tab-delimited txt最有效地删除第 n 行制表符分隔的 txt
【发布时间】:2014-07-24 06:03:15
【问题描述】:

我有一个制表符分隔的 txt 文件。

我想删除第 n 行制表符分隔的 txt。

我会分配喜欢

n = 1

然后程序将只删除文件的第一行。

如果程序在没有读取整个输入文件的情况下执行此操作,那就太棒了。

我试图从我之前的一个问题中学习:

Concatenate tab-delimited txt files vertically

这个问题是垂直连接两个制表符分隔的 txt 文件。所以我认为扭转这个过程会对我做类似的事情。但我找不到怎么做。

我还尝试了许多其他 stackoverflow 答案。

但它们大多是“删除具有特定短语的行”而不是“删除第 n 行”

(How to delete a line from a text file using the line number in python, Deleting a specific line in a file (python), Deleting a line from a file in Python)

【问题讨论】:

  • 除非行长度相同,否则读取所有行并打印除您要删除的行之外的所有行。
  • @tripleee 尽管该问题的标题说使用行号删除,但该问题实际上并非如此。该问题明确指定“phrase = 'the dog barked'”并删除带有该短语的行。
  • @tripleee 输入文件的行长度相同。换句话说,所有行都有相同的列数。那么是否可以不读取所有行并删除第n行?
  • 然后可以通过寻找特定的偏移量并重写文件来更有效地做到这一点。但是,除非您可以使用虚拟记录(或真实的数据记录)重写并保持文件的其余部分完好无损,否则我认为这不值得。

标签: python file csv


【解决方案1】:

您可以为此使用itertools.islice。这里不涉及 Python for 循环,所以它应该很快:

from itertools import islice

n = 4
with open('file.txt') as f, open('out.txt', 'w') as out:
    out.writelines(islice(f, n-1)) #write the lines before the nth line
    out.writelines(islice(f, 1, None)) #write the rest of the lines except nth

【讨论】:

  • 不应该在最后一行中使用n 而不是1 吗?
  • @igor 不,它应该是1,因为文件对象已经被分割到第 (n-1) 行。现在我们需要从第 2 个索引(1)开始忽略第 n 行。
【解决方案2】:
lineToRemove = 7

f = open("yourfile.txt","r")
lines = f.readlines()
f.close()

f = open("yourfile.txt","w")
linesInFile = 0
for line in lines:
    linesInFile = linesInFile + 1
    if linesInFile != lineToRemove:
        f.write(line)
f.close()

编辑:通过使用del 并省略明确的openclose,我们可以减少代码:

lines = file("yourfile.txt", "r").readlines()
del lines[6]
file("yourfile.txt", "w").writelines(lines)

请注意del lines[6] 删除了第 7 行,因为索引从零开始。所以,我们可以使用一个方便的函数:

def deleteLine(filename, lineToRemove):
    lines = file(filename, "r").readlines()
    del lines[lineToRemove-1]
    file(filename, "w").writelines(lines)

【讨论】:

  • 谢谢!这完美地工作。但是,这个程序会读取整个输入文件吗?输入文件的行长度相同。换句话说,所有行都有相同的列数。那么是否可以不读取所有行并删除第n行?
  • 这样的效率如何?
猜你喜欢
  • 2021-12-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2016-01-08
相关资源
最近更新 更多