用python删除文件中的最后一行

用python删除文件中的最后一行,python,text,line,Python,Text,Line,如何使用python删除文件的最后一行 输入文件示例: hello world foo bar hello world foo 输出文件示例: hello world foo bar hello world foo 我创建了以下代码来查找文件中的行数,但我不知道如何删除特定的行号 try: file = open("file") except IOError: print "Failed to read fil

如何使用python删除文件的最后一行

输入文件示例:

hello
world
foo
bar
hello
world
foo
输出文件示例:

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

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

您可以使用上述代码,然后:-

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

这将为您提供一个包含除最后一行之外的所有行的行数组。

这不使用python,但如果这是您想要的唯一任务,python是错误的作业工具。您可以使用标准*nix实用程序
,然后运行

head -n-1 filename > newfile
这将把除最后一行以外的所有文件名复制到新文件。

在工作的系统上,您可以执行以下操作:

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)

根据我的测试,file.tell()在逐行读取时不起作用,可能是因为缓冲区混淆了它。这就是为什么要把线的长度加起来计算位置。请注意,这仅适用于行分隔符以“\n”结尾的系统。

如果必须在Python中执行此操作,并且您有一个足够大的文件,列表切片是不够的,则可以在文件上执行一次:

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
虽然不是世界上最优雅的代码,但它完成了任务


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

虽然我没有测试过它(请不要讨厌它),但我相信有一种更快的方法。这更像是一个C解决方案,但在Python中是完全可能的。这也不是蟒蛇。我认为这是一种理论

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

然后获取文件的大小,设置FILEsize

假设您在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()

这里有一个更通用的内存效率更高的解决方案,允许跳过最后的“n”行(如
head
命令):


因为我经常处理很多千兆字节的文件,所以答案中提到的循环对我来说不起作用。我使用的解决方案是:

打开(sys.argv[1],“r+”,encoding=“utf-8”)作为文件:
#将指针(类似于文本编辑器中的光标)移动到文件末尾
file.seek(0,os.seek_END)
#此代码表示以下代码跳过文件中的最后一个字符-
#即,如果最后一行为空,则删除最后一行
#倒数第二个呢
pos=file.tell()-1
#从倒数第二位一次读取文件中的每个字符
#字符向后移动,搜索换行符
#如果找到新行,请退出搜索
而pos>0和file.read(1)!=“\n”:
位置-=1
文件搜索(位置、操作系统搜索集)
#只要我们不在文件的开头,就删除前面的所有字符
#这个职位的职位
如果位置>0:
文件搜索(位置、操作系统搜索集)
file.truncate()文件

以下是我针对linux用户的解决方案:

import os 
file_path = 'test.txt'
os.system('sed -i "$ d" {0}'.format(file_path))

不需要在python中读取和迭代文件

从以前的帖子中,我提出了以下建议:

with open('file_name', 'r+') as f:
  f.seek(0, os.SEEK_END) 
  while f.tell() and f.read(1) != '\n':
    f.seek(-2, os.SEEK_CUR)
  f.truncate()

这对大文件有效吗?例如,数千行?对于大于1兆字节或2兆字节的文件,它可能无法正常工作。取决于你对“好”的定义。对于任何桌面使用几千行都应该是完美的。好吧,在一两秒钟内。没有其他方法可以直接删除特定的行吗?或者数组是一种方法吗?纳扎里乌斯:没有任何方法可以删除特定的行。但是,您可以截断文件或将其追加。由于要删除最后一行,您可以直接截断。您是否确实要从磁盘上的文件中删除该行?如果是这样,请确保您理解从文件系统的角度来看,文件没有“行”。行是程序员和程序的惯例。你所看到的“行”是一个字节序列,在许多其他字节的中间。要删除最后一行,可以在与行中第一个字符对应的字节处截断文件。这并不困难(你只需要找到它),但是如果涉及的文件大小不是很多兆字节,那就没有什么意义了。如果最后一行是空行呢?最后一行不是空的。我用另一个python代码片段(来自google)删除了所有的空行。你已经在python中“删除了所有空行”了吗?所以你不是真的想删除文件的最后一行,是吗?您实际上是在将文件读入内存,以便删除空行并进行其他处理?你想做的一件事是在写回文件之前去掉最后一行?这离你真正想要的有多近??文件不包含空白行吗?上面的例子是你应该看的,没有别的。最后一行是我需要删除的内容。为什么要屈尊俯就?我几乎明白了草莓的答案。在一个使用多个字符作为“行尾”的平台上非常危险。。。就像在Windows中一样。很好。(这就是我最初打算使用tell()的原因,但它不起作用)