使用python删除文件中的行的更好方法?

时间:2011-05-24 21:30:18

标签: python file-io

我想删除文件中的一行;目前我正在创建一个新文件,复制除了我要删除的文件以外的每一行,删除旧文件并将新文件重命名为与旧文件相同的文件名。有没有更好的方法来删除一行?

f = open('./todo.txt', 'r')
newF = open('./todo-run.txt', 'a')
lines = f.readlines()
cLine = lines[int(index) - 1]

for line in lines:
  if line != cLine:
    newF.write(line)
f.close()
newF.close()
os.remove('./todo.txt')
shutil.move('./todo-run.txt', './todo.txt')

4 个答案:

答案 0 :(得分:2)

sed中的解决方案,您可以使用“subprocess”调用它。例如,删除第18行:

sed -i '18 d' filename

答案 1 :(得分:1)

更好的方式是什么?例如,您可以将文件中的数据随机化,然后截断它,使用更少的内存但更多的寻求(特别是如果您将其调整为不在一个块中读取后一部分):

def cutfile(file, startcut, endcut):
  file.seek(endcut)
  dataafter=file.read()
  file.seek(startcut)
  file.write(dataafter)
  file.truncate()

或者您无法在重命名之前删除旧文件以获取原子更新。这真的取决于你的目标。

答案 2 :(得分:0)

它并不比你的好,但是(因为你的文件似乎适合主存)你可以试试这个:

f = open(filepath, 'r')
lines = [line.rstrip('\n') for line in f if not <CONDITION>]
f.close()
f.open('filepath, 'w')
f.write('\n'.join(lines))
f.close()

答案 3 :(得分:0)

您可以通过一次覆盖一行来移动不需要的排列后的行。虽然没有比你现在做的好多少。如果文件不以换行符结尾,则此代码有点滑稽。我在Win7 64位,Python 2.7上进行了测试。

move_lines.py:

f = open('todo.txt', 'r+')
line_index = 0
prev_line_head = 0
remove_line_index = 3
move_lines = False
while True:
  line_head = f.tell()
  line = f.readline()

  if line == '': #EOF
    f.seek(prev_line_head)
    f.truncate()
    break

  if move_lines:
    f.seek(prev_line_head)
    f.write(line)
    f.flush()
    line_head = f.tell()
    line = f.readline() # read past the line we already read to start this iteration
  elif line_index == remove_line_index:
    move_lines = True
  prev_line_head = line_head
  line_index += 1
f.close()