我想删除文件中的一行;目前我正在创建一个新文件,复制除了我要删除的文件以外的每一行,删除旧文件并将新文件重命名为与旧文件相同的文件名。有没有更好的方法来删除一行?
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')
答案 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()