Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.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_Python 3.x - Fatal编程技术网

如何在python中替换文件中的特定值

如何在python中替换文件中的特定值,python,python-3.x,Python,Python 3.x,我试图用一个值替换零。到目前为止,这是我的代码,但我接下来要做什么 g = open("January.txt", "r+") for i in range(3): dat_month = g.readline() Month: January Item: Lawn Total square metres purchased: 0 monthly value = 0 要写入文件,请执行以下操作: with open("Outfile.txt", "wt") as outfil

我试图用一个值替换零。到目前为止,这是我的代码,但我接下来要做什么

g = open("January.txt", "r+")
for i in range(3):
        dat_month = g.readline()

Month: January
Item: Lawn
Total square metres purchased:
0
monthly value = 0
要写入文件,请执行以下操作:

with open("Outfile.txt", "wt") as outfile:
然后

outfile.write(dat_month)
你可以这样做- 但这不是通常的方法,当然也不是文本文件的正确方法

正确的方法是编写另一个文件,其中包含要更新的信息,然后将新文件重命名为旧文件。这是处理文本文件的唯一明智方法,因为字段的信息大小(以字节为单位)是可变的

至于你正在“向磁盘写入200字节”而不是一个字节的印象,改变你的值,不要让它愚弄你:在操作系统级别,所有的文件访问都必须在块中完成,这些块通常有几千字节长(在特殊情况下,在tunned文件系统中可能有几百字节)。无论如何,在用户空间程序中,更不用说像Python这样的高级语言中,您永远不会触发少于几百字节的磁盘写入

现在,对于代码:

import os
my_number = <number you want to place in the line you want to rewrite>
with open("January.txt", "r") as in_file, open("newfile.txt", "w") as out_file:

    for line in in_file:
        if line.strip() == "0":
             out_file.write(str(my_number) + "\n")
        else:
             out_file.write(line)

os.unlink("January.txt")
os.rename("newfile.txt", "January.txt")
导入操作系统
我的号码=
打开(“一月.txt”、“r”)作为in_文件,打开(“newfile.txt”、“w”)作为out_文件:
对于\u文件中的行:
如果line.strip()=“0”:
out\u file.write(str(我的\u编号)+“\n”)
其他:
输出文件。写入(行)
os.unlink(“一月.txt”)
重命名(“newfile.txt”,“一月.txt”)
所以-这是总的想法- 当然,您不应该以这种方式使用硬编码的所有值编写代码(即,要检查和写入的值与文件名一样固定在程序代码中)

至于
with
语句,它是该语言的一种特殊结构,非常适合在块中打开文件并进行操作,就像在本例中一样,但它不是必需的

除了编程,您必须记住的概念是: 当您使用允许您编辑文本文件、电子表格、图像的应用程序时,作为用户,您可能会有这样的印象,即在您完成并保存工作后,更新将提交到同一个文件。在绝大多数的使用案例中,并非如此:应用程序在内部使用类似于我上面介绍的模式-一个全新的文件被写入磁盘,旧文件被删除或重命名。少数例外可能是简单的数据库应用程序,它可以在更新时替换文件本身内的固定宽度字段。现代数据库当然不会这样做,而是在文件末尾追加最新更新的信息。PDF文件是另一种在创建时不会在每次更新时完全替换的文件:但在这种情况下,更新的信息会写在文件末尾,即使更新发生在呈现文档开头的页面中。

尝试以下方法:

import fileinput
import itertools
import sys
with fileinput.input('January.txt', inplace=True) as file:
    beginning = tuple(itertools.islice(file, 3))
    sys.stdout.writelines(beginning)
    sys.stdout.write(next(file).replace('0', 'a value'))
    sys.stdout.write(next(file).replace('0', 'a value'))
    sys.stdout.writelines(file)

也许问题在于将替换内容写回文件OK,也添加了相关信息。谢谢你的代码,但我正在gcse级别上进行python编程。我理解你的意思,但我主要避免老师还没有教我们的东西,例如导入操作系统和使用with函数,我不太清楚它的功能。我已经完成了任务,巧合的是,我确实按照你所说的指导方针做了一些事情。我所做的是读取文件(0),然后将其保存在一个变量中,然后完全重写该文件。我的教师解决方案与在python中使用sql有关抱歉,回复太晚了,没想到会有这么好的回答如果你是一个乞丐,不尝试替换文件的值是重要的两倍。坚持创建一个新文件——这就是程序的工作方式。对于初学者来说,
with
语句可以是“可选的”,只需打开输入文件进行读取,打开输出文件进行写入即可。无论您的技术人员向您展示了
os
模块,您都可以通过自己的学习获得很多好处。
import fileinput
import itertools
import sys
with fileinput.input('January.txt', inplace=True) as file:
    beginning = tuple(itertools.islice(file, 3))
    sys.stdout.writelines(beginning)
    sys.stdout.write(next(file).replace('0', 'a value'))
    sys.stdout.write(next(file).replace('0', 'a value'))
    sys.stdout.writelines(file)