others - 通过 python,删除文件最后一行

如何通过python删除文件的最后一行?

例子文件:

 
hello
world
foo
bar

 

结果文件:

 
hello
world
foo

 

我创建了以下代码来查找文件中的行数,但是我不知道如何删除特定的行号,


	try:
		file = open("file")
	except IOError:
		print"Failed to read file."
	countLines = len(file.readlines())



#!/usr/bin/env python

import os, sys

readFile = open("file")

lines = readFile.readlines()

readFile.close()
w = open("file",'w')

w.writelines([item for item in lines[:-1]])

w.close()

时间:

你可以使用上面的代码,然后:


lines = file.readlines()
lines = lines[:-1]

我使用的解决方案:


file = open(sys.argv[1],"r+", encoding ="utf-8")

#Move the pointer (similar to a cursor in a text editor) to the end of the file. 
file.seek(0, os.SEEK_END)

#This code means the following code skips the very last character in the file - 
#i.e. in the case the last line is null we delete the last line 
#and the penultimate one
pos = file.tell() - 1

#Read each character in the file one at a time from the penultimate 
#character going backwards, searching for a newline character
#If we find a new line, exit the search
while pos > 0 and file.read(1) !="n":
 pos -= 1
 file.seek(pos, os.SEEK_SET)

#So long as we're not at the start of the file, delete all the characters ahead of this position
if pos > 0:
 file.seek(pos, os.SEEK_SET)
 file.truncate()

file.close()

你可以使用标准*nix实用程序head,并运行,


head -n-1 filename > newfile


last_line = None
for line in file:
 if last_line:
 print last_line # or write to a file, call a function, etc.
 last_line = line

不是世界上最优雅的代码,但是它能完成工作。

基本上,它通过last_line变量缓冲文件中的每一行,每次迭代都输出前一个迭代行。

file.truncate()工作的系统上,你可以执行如下操作:


file = open('file.txt', 'rb')
pos = next = 0
for line in file:
 pos = next # position of beginning of this line
 next += len(line) # compute position of beginning of next line
file = open('file.txt', 'ab')
file.truncate(pos)

注意,仅在行分隔符以'n'结尾的系统上工作。

虽然我没有测试它,但我相信有一个快速的方法去进行它。 它更像是一个C 解决方案,但在 python 中很可能。 不是 Pythonic,要么。 这是个理论,我说。

首先,你需要知道文件的编码。 将一个变量设置为该编码中的字符使用( 1字节 ASCII )的字节数。 CHARsize ( 为什么不) 。 可能是 1字节的ASCII文件。

然后抓取文件的大小,为它设置大小

假设你的文件( 在内存中)的地址为 FILEadd

添加文件大小, FILEadd

移动 backwords ( 增量由 -1 * CHARsize ), 测试每个CHARsize字节 n ( 或者你的系统使用的任何换行符) 。 到达第一个 n, 时,你现在拥有文件第一行的起始位置。 将 n 替换为 x1a ( 26,用于EOF的ASCII,或者是你的系统/具有编码的任何内容) 。

清理你需要的( 更改文件大小,触摸文件) 。

如果这可以正常工作,你就会节省很多时间,因为你不需要从头通读整个文件,你从末尾读取。

这是另一种方式,不需要将整个文件插入内存,


p=""
f=open("file")
for line in f:
 line=line.strip()
 print p
 p=line
f.close()

以下是更通用的解决方案,允许跳过最后一行:


import collections, fileinput
def head(filename, lines_to_delete=1):
 queue = collections.deque()
 lines_to_delete = max(0, lines_to_delete) 
 for line in fileinput.input(filename, inplace=True, backup='.bak'):
 queue.append(line)
 if lines_to_delete == 0:
 print queue.popleft(),
 else:
 lines_to_delete -= 1
 queue.clear()

...