Python 更新文本文件,添加标题及其对应的值

0 投票
3 回答
4012 浏览
提问于 2025-04-18 13:21

我有一个名为headerValue.txt的文本文件,里面包含以下数据:

Name   Age
sam    22
Bob    21

我想写一个Python脚本,添加一个新的标题叫做“Eligibility”(资格)。这个脚本会读取文本文件中的每一行,检查年龄是否大于18岁。如果是的话,就会在“Eligibility”标题下打印“True”,并且再添加一个标题叫“Adult”(成年人),在下面打印“yes”,如果年龄小于18岁则打印“no”。

因为在文本文件中,两个年龄都大于18岁,所以输出结果大概会是这样的:

Name    Age    Eligibility    Adult
sam     22       True         yes
Bob     21       True         yes

代码片段:

fo =open("headerValue.txt", "r")
data = fo.readlines()
for line in data:
    if "Age" in line:
        if int(Age) > 18:
            Eligibility = "True"
            Adult = "yes"

我在这里有点卡住了,因为我对Python还不太熟悉。有没有人能帮我更新文本文件,并添加标题和对应的值呢?谢谢!

3 个回答

0

这个模块非常适合你使用:https://docs.python.org/2/library/fileinput.html?highlight=fileinput#fileinput

如果你想编辑一个输入文件,可以使用:

#!/usr/bin/python
import fileinput

cont = 0
for line in fileinput.input("./path/to/file", inplace=True):
    if not cont:
        name = "Name"
        age = "Age"
        Eligibility= "Eligibility"
        Adult = "Adult"
    else:
        name ,age = line.split()
        if int(age) > 18:
                Eligibility = "True"
                Adult = "yes"
    print "{0}\t{1}\t{2}\t{3}".format(name, age, Eligibility, Adult)
    cont += 1

这样做会更新你的原始文件。

1

你想检查字符串 "Age" 是否在某一行中存在。它只出现在第一行。然后你尝试把一个变量 Age 转换成整数,看看它是否大于18。不过我没有看到你在哪里定义过 Age,所以我不能确定这段代码能否运行。

看起来你有一个用制表符或空格分隔的文件。它看起来像个CSV文件,所以你可以把它当作CSV文件来处理。这样做更简单,因为Python提供了一个内置的 csv 模块。在这个模块里,有 csv.DictReadercsv.DictWriter 这两个对象,可以让你把CSV文件中的每一行当作字典来修改。在下面的文件中,csv.DictWriter 会自动获取默认的表头名称,而 restval 参数则定义了字段的默认值。这让代码变得更简单,如下所示:

>>> with open("test.csv", "r") as inf, open("out.csv", "w") as outf:
...    in_reader = csv.DictReader(inf, delimiter=" ")
...    out_writer = csv.DictWriter(outf, delimiter=" ", fieldnames=['Name', 'Age', 'Eligibility', 'Adult'], restval=False)
...    out_writer.writeheader()
...    for line in in_reader:
...        if int(line['Age']) > 18:
...             line['Eligibility'] = True
...             line['Adult'] = True
...         out_writer.writerow(line)

输入文件是 test.csv:

msvalkon@lunkwill~$: cat test.csv
Name Age
sam 22
Bob 21
foo 5

输出文件是 out.csv:

msvalkon@lunkwill~$: cat out.csv
Name Age Eligibility Adult
sam 22 True True
Bob 21 True True
foo 5 False False
1
fo =open("headerValue.txt", "r")
data = [l.split() for l in fo.readlines()]
headers = data[0]
headers.extend(('Eligibility', 'Adult'))
ageind = headers.index('Age')
for line in data[1:]:
    if int(line[ageind]) > 18:
        line.extend(('True', 'yes'))
    else:
        line.extend(('False', 'no'))

你代码里的 if 语句只会对第一行成立(而不是你想要的那一行)。我把它改成了检查年龄的索引。此外,通常变量名是小写的,不用大写。

还有,关于 data = [l.split() for l in fo.readlines()] 这行代码,看起来你的文件是用空格分开的。如果是用制表符或逗号分开的,你可以相应地进行分割,不过我建议使用 csv 模块。

撰写回答