python-修改后重写文件

python-修改后重写文件,python,replace,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

我有一个名为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\u time,string)
将所需更改的第一行输出到标准输出,但如何修改文件的内容?

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

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

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

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

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

import fileinput

for line in fileinput.input(['inputs.txt'], inplace=True):
    print re.sub(r'_[0-9-]+', change_time, line) ,
我给出了Python2格式的
print
,因为这似乎就是您正在使用的。无论如何,在Python 3中,它将是类似的,并且更具可读性:

    print(re.sub(r'_[0-9-]+', change_time, line), end='')
无论如何,
fileinput
重定向标准输出,以便所有
print
s都转到您正在读取的文件(当
inplace=True
已设置时)——您需要打印出您正在读取的所有内容,并进行更改。可以处理任意数量的文件(请注意,第一个参数是文件名列表),无论它们有多大,等等


有关更多信息,请参见:-)

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

import fileinput

for line in fileinput.input(['inputs.txt'], inplace=True):
    print re.sub(r'_[0-9-]+', change_time, line) ,
我给出了Python2格式的
print
,因为这似乎就是您正在使用的。无论如何,在Python 3中,它将是类似的,并且更具可读性:

    print(re.sub(r'_[0-9-]+', change_time, line), end='')
无论如何,
fileinput
重定向标准输出,以便所有
print
s都转到您正在读取的文件(当
inplace=True
已设置时)——您需要打印出您正在读取的所有内容,并进行更改。可以处理任意数量的文件(请注意,第一个参数是文件名列表),无论它们有多大,等等


有关更多详细信息,请参见:-)

如果您没有编写太多程序,则很容易将文件视为在编辑器中看到的文件,在编辑器中,您可以将光标定位在特定点并在该点插入字符,从而使文件中的其他字符“向右滑动”。写入文件不是这样工作的。相反,在特定点写入文件会删除该点之后的所有文件内容,这意味着您需要将整个文件读入内存,修改文件内容,然后将内容写回文件

更具体地说,由于修改后文件中的字节数不同,并且所有字符的插入/删除都不会发生在文件的末尾,因此您通常需要遵循以下步骤:

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

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)

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

更具体地说,由于修改后文件中的字节数不同,并且所有字符的插入/删除都不会发生在文件的末尾,因此您通常需要遵循以下步骤:

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

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)

因此,问题实际上是如何读取文件的内容?在我看来,您对编程和python都比较陌生。这没什么错,但如果这不是真的,那么我们可能完全误解了你的问题……是的。以前从未做过任何编码。慢慢地试着把它捡起来。我的问题是如何匹配模式并替换同一文件中的模式。我能够想出如何编写一个函数来获得所需的输出时间格式,但从来没有想到如何读写同一个文件。这是有意义的。我想你在想一个文件,就像你在编辑器中看到的一样,当你插入一个新字符时,所有其他字符都会向右滑动。相反,写入文件会删除文件中写入点之后的所有内容。您需要将整个文件读入内存,在内存中修改副本,然后完全重写文件(请参见下面的答案),所以问题实际上是如何读取文件的内容?在我看来,您对编程和python都比较陌生。这没什么错,但如果这不是真的,那么我们可能会大发雷霆