Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修改文件的最后一行?_Python_File - Fatal编程技术网

Python 如何修改文件的最后一行?

Python 如何修改文件的最后一行?,python,file,Python,File,我的文件的最后一行是: 29迪兹,40 如何修改该行,使其显示: 29迪兹,40,90100,50 注:我不想写新行。我想用同一行,在29 Dez,40, 我是python新手。我在处理文件时遇到了很多麻烦,对我来说,我看到的每个示例似乎都很困难。不要直接处理文件,以类的形式创建适合您需要的数据结构,并创建从文件读取/写入文件的方法。除非文件很大,否则您可能会发现将整个文件读入数据结构更容易(这可能只是一个行列表),然后修改内存中的数据结构,最后将其写回文件 另一方面,您的文件可能非常大,至少有

我的文件的最后一行是:

29迪兹,40

如何修改该行,使其显示:

29迪兹,40,90100,50

注:我不想写新行。我想用同一行,在
29 Dez,40,


我是python新手。我在处理文件时遇到了很多麻烦,对我来说,我看到的每个示例似乎都很困难。

不要直接处理文件,以类的形式创建适合您需要的数据结构,并创建从文件读取/写入文件的方法。

除非文件很大,否则您可能会发现将整个文件读入数据结构更容易(这可能只是一个行列表),然后修改内存中的数据结构,最后将其写回文件

另一方面,您的文件可能非常大,至少有多个GBs。在这种情况下:最后一行可能以新行字符结尾,如果您试图到达该位置,您可以在最后一行末尾用新文本覆盖它

所以也许:

f = open("foo.file", "wb")
f.seek(-len(os.linesep), os.SEEK_END) 
f.write("new text at end of last line" + os.linesep)
f.close() 
(不同平台上的模行结尾)

要展开什么,为了将文件内容读入数据结构,可以使用文件对象的

下面的代码示例将文件读入“行”列表,编辑最后一行,然后将其写回文件:

#!/usr/bin/python

MYFILE="file.txt"

# read the file into a list of lines
lines = open(MYFILE, 'r').readlines()

# now edit the last line of the list of lines
new_last_line = (lines[-1].rstrip() + ",90,100,50")
lines[-1] = new_last_line

# now write the modified list back out to the file
open(MYFILE, 'w').writelines(lines)

如果文件非常大,那么这种方法将不能很好地工作,因为这种方法每次都将所有文件行读入内存,然后将它们写回文件,这是非常低效的。但是对于小文件,这种方法可以很好地工作。

我最近编写了一个脚本来执行类似的操作。它将遍历一个项目,查找所有文件模块依赖项,并添加任何缺少的导入语句。我不会用整个脚本把这篇文章弄得乱七八糟,但我会展示我是如何修改我的文件的

import os
from mmap import mmap

def insert_import(filename, text):
    if len(text) < 1:
        return
    f = open(filename, 'r+')
    m = mmap(f.fileno(), os.path.getsize(filename))
    origSize = m.size()
    m.resize(origSize + len(text))
    pos = 0
    while True:
        l = m.readline()
        if l.startswith(('import', 'from')):
            continue
        else:
            pos = m.tell() - len(l)
            break
    m[pos+len(text):] = m[pos:origSize]
    m[pos:pos+len(text)] = text
    m.close()
    f.close()
导入操作系统
从mmap导入mmap
def insert_导入(文件名,文本):
如果len(text)<1:
返回
f=打开(文件名为“r+”)
m=mmap(f.fileno(),os.path.getsize(filename))
origSize=m.尺寸()
m、 调整大小(原始大小+长度(文本))
pos=0
尽管如此:
l=m.读线()
如果l.startswith(('import','from')):
持续
其他:
pos=m.tell()-len(l)
打破
m[pos+len(文本):]=m[pos:origSize]
m[pos:pos+len(text)]=文本
m、 关闭()
f、 关闭()
摘要:此代码段需要插入一个文件名和一个文本块。它会找到已经存在的最后一条导入语句,并将文本粘贴到该位置


我建议最注意的部分是mmap的使用。它可以让你以处理字符串的方式处理文件。非常方便。

这很难,因为它很难。你所做的对于具有可变长度行的文本文件来说并不是很明智。请看这个问题的后续内容。我修改了你的任务非常重要的是,如果我误解了什么,请告诉我。S.Lott也是对的,虽然看起来应该很简单,但修改文件实际上相当困难。对于Python 3.2及更高版本,您只能从文件(文本文件)的开头开始执行查找操作。