用python删除文件中的最后一行
如何使用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
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()的原因,但它不起作用)