什么是修改文本文件的最佳方式?

2024-06-16 09:46:41 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉,如果已经有人问过类似的问题-我确实搜索了一下,我可能漏掉了一些东西,但至少在我看来,其他问题的答案并不是我想做的同一件事。

我有一个文本文件(我们称之为“potatos.txt”),其中包含以下信息:

Town 1,300,
Town 2,205,
Town 3,600,
Town 4,910,
Town 5,360,

我想做的是减少某些城镇的数量,并相应地修改文本文件。 我做了一个小的研究,你似乎不能修改文本文件,我需要文本文件有相同的名字,只是里面有不同的值,所以我现在做的是:

f = open("ModifiedPotatoes.txt","w")
f.close()

with open("Potatoes.txt","r") as file:
    for line in file:
       info = line.split(",")
       if "Town 2" or "Town 4" in line:
           info[1] -= 20
       with open("ModifiedPotatoes.txt","a"):
           infoStr = "\n" + ",".join(str(x) for x in info)
           file.write(infoStr)

f = open("Potatoes.txt","w")
f.close()

with open("ModifedPotatoes.txt","r") as file:
    for line in file:
        with open("Potatoes.txt","a") as potatoesFile:
            potatoesFile.write(line)

所以基本上我只是将旧文件重写为空白文件,然后从修改后的/临时文件中复制值。有没有更好的方法来做这个我失踪了?

谢谢你的帮助。


Tags: ininfotxtforcloseaswithline
3条回答

您可以使用csv模块来处理文件/字符串。

只需读取所有值并逐行循环,根据需要进行调整。然后使用csv.writer对象将它们写回新文件。

import csv
import shutil
import os

with open('potatoes.txt') as f, open('newpotatoes.txt', 'w') as fout:
    rdr = csv.reader(f)
    wrt = csv.writer(fout)

    for line in rdr:
        if line[0] in ('Town 2', 'Town 4'):
            line[1] = str(int(line[1]) - 20)
        wrt.writerow(line)

shutil.copyfile('newpotatoes.txt', 'potatoes.txt')
os.remove('newpotatoes.txt')

线路

line[1] = str(int(line[1]) - 20)

可能有点乱。这是因为csv中的值都是字符串。所以这是一个简单的方法,把它转换成一个整数,减去20,再转换回一个字符串。

看看你的代码,里面有一个初学者经常犯的错误。

if "Town 2" or "Town 4" in line:

你必须意识到这是两个独立语句的组合,而不是你所期望的。第一个语句是Town 2,它的计算结果总是True。第二个语句是"Town 4" in line",如果字符串“Town 4”包含在line字符串中的任何位置,则返回True。

毫无疑问,您的意图是测试字符串是否在line中。为此,需要显式测试两个字符串。

if "Town 2" in line or "Town 4" in line:

将按预期工作。不过,你可以更进一步,去掉声明中的一些不雅之处。

你知道字符串应该总是出现在字符串的第一个元素中,在split之后,这就是代码中的info[0](或者在我让csv进行拆分时,line[0]在我的代码中)。

因此你可以写

if line[0] in ('Town 2', 'Town 4'):

我认为你会同意这一点,即阅读更容易,打字重复更少,特别是如果你继续增加更多的城镇。

尝试:

mod_lines = []

with open("Potatoes.txt", "r") as f:
    for line in f:
        info = line.split(",")
        if info[0] in ("Town 2", "Town 4"):
            info[1] = int(info[1]) - 20
        mod_lines.append(info)

with open("Potatoes.txt", "w") as f:
    for m in mod_lines:
        f.write(",".join([str(x) for x in m]))

这当然不是最好的方法,但肯定会更好,也行得通。

I did a little research and it appears you can't modify text files

有一个模块在循环文本时提供与修改文本相同的效果。尝试使用fileinput模块,并将inplace选项设置为True

下面是一个小Python3.6代码,让您开始:

from fileinput import FileInput

with FileInput(files=['Potatoes.txt'], inplace=True) as f:
    for line in f:
        line = line.rstrip()
        info = line.split(",")
        if "Town 2" in line or "Town 4" in line:
            info[1] = int(info[1]) - 20
            line = ",".join(str(x) for x in info))
        print(line)

相关问题 更多 >