python - 重写一个包含修改的文件

时间:2014-12-31 16:31:29

标签: python replace

我有一个名为inputs.txt的文件,我试图用函数的值替换该文件中的字符串。问题是我无法写入该文件。我刚刚开始学习python,所以我很挣扎。请帮忙。

当我将它作为字符串时,它可以正常工作

文件内容

[aws_s3://MAC_10]
key_name = ABC/YYZZ/daily

期望的输出

[aws_s3://MAC_2014-12-31]
key_name = ABC/YYZZ/daily/2014-12-31_

我编写了将时间值设为

的函数
def change_time(match):
    match = match.group()
    date_time = datetime.datetime.now()
    value = str(date_time.strftime('%Y-%m-%d'))
    return value

我能够打开文件并阅读和匹配内容,但我无法写信给

f=open('test.txt','w')

print re.sub(r'_[0-9-]+',change_time,string)将所需更改的第一行输出到stdout,但如何修改文件的内容?

3 个答案:

答案 0 :(得分:3)

读取和写入相同的文件可能很棘手,但标准库的fileinput模块支持这一点:

import fileinput

for line in fileinput.input(['inputs.txt'], inplace=True):
    print re.sub(r'_[0-9-]+', change_time, line) ,

我正在使用{2}格式的print,因为它似乎是您正在使用的内容。无论如何,在Python 3中它会更相似,更具可读性:

    print(re.sub(r'_[0-9-]+', change_time, line), end='')

无论如何,fileinput重定向标准输出,以便所有print转到您正在阅读的文件(当inplace=True已设置时) - 您需要打印出所有你正在阅读的内容,需要进行更改。可以根据需要使用尽可能多的文件(请注意,第一个参数是文件名列表),无论它们有多大等等。

请参阅https://docs.python.org/2/library/fileinput.html了解更多内容: - )

答案 1 :(得分:1)

如果编程不多,可能很容易想到在编辑器中看到的文件,您可以将光标定位在特定点并在该点插入字符,从而导致文件中的其他字符到"向右滑动"。写入文件不会以这种方式工作。相反,在特定点写入文件会删除该点之后的所有文件内容,这意味着您需要将整个文件读入内存,修改文件内容,然后将内容写回文件。

更具体地说,由于文件在修改后将具有不同的字节数,并且文件的末尾不会发生所有字符的插入/删除,因此以下是一般<的过程/ em>想要关注:

首先,您将文件的全部内容读入内存,例如

import io
with io.open('file.ini') as fobj:
    contents = fobj.read()

请注意,运行此代码后,文件将再次关闭:您已将文件内容复制到内存中,并且文件在磁盘上保持不变。

接下来,您将以所需的方式修改文件的内容

def change_time(match):
    match = match.group()
    date_time = datetime.datetime.now()
    value = str(date_time.strftime('%Y-%m-%d'))
    return value

new_contents = re.sub(r'_[0-9-]+',change_time,contents)

现在,您以写入模式重新打开文件。这会立即丢弃文件的内容,并从内存中回写您自己的(现在已修改的)副本

with io.open('file.ini','wb') as fobj:
    fobj.write(new_contents)

答案 2 :(得分:0)

解决方案是读取值,编辑内存中的更改并编写新值

contents = open('file.ini').read()
contents = re.sub(r'_[0-9-]+',change_time,contents)
with open('file.ini', 'w') as fout:
    fout.write(contents)