我有一个名为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,但如何修改文件的内容?
答案 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)