【问题标题】:How can i loop through each line in a file and assign variables to the lines我如何遍历文件中的每一行并将变量分配给这些行
【发布时间】:2019-09-27 19:19:43
【问题描述】:

我正在尝试读取文件的每一行,然后将每 3 行分配给相同的变量。例如,我有一个文件如下:

james
male
32
julie
female
29
mark
male
35

我想遍历列表并打印出每条记录,并在相关行旁边显示姓名、性别和年龄,或者当我按姓名搜索时,即“詹姆斯”,我希望输出显示:

name: james
gender:male
age: 32

到目前为止,我能够将文本文件中的所有行放入一个列表中,但我无法弄清楚如何遍历列表以将每一行分配给变量名称、性别、年龄

fileList = []
print("This function prints the records out one by one")
file2 = open(fileName, "r")
file_line = file2.readlines()
file_line = [x.strip() for x in file_line]
for line in file_line:
    fileList.append(line)
print(fileList)
print("Name: {}\nGender:: {}\nAge: {}\n".format(fileList[0], fileList[1], fileList[2]))

这允许我在我专门选择列表中的位置时访问这些行,但我希望它遍历整个列表并打印列表中的所有内容或在我按名称搜索时打印特定人员记录

【问题讨论】:

  • 如果订单在某处发生变化怎么办,例如“马克,36,男”?相信这样的“结构”可能是危险的;如果您的“数据库”变得更大,还有更多有用的格式,例如 csv、json、...

标签: python


【解决方案1】:

解决方案的关键是您需要一次阅读三行。幸运的是,由于文件对象的行为类似于迭代器,您可以在 zip 中使用打开的文件对象 3 次

with open(fileName) as infile:
    for name, gender, age in zip(infile, infile, infile):
        print("name:", name)
        print("gender:", gender)
        print("age:", age)

【讨论】:

    【解决方案2】:

    您在这里主要要做的是以一定大小的块读取文件(在这种情况下,每个块 3 行)。 inspectorG4dget 的好回答让我想到了以下更通用但也更复杂的选项。借用itertools recipes,可以使用函数grouper()从文件中获取定义大小的块(在本例中为3):

    from itertools import zip_longest
    
    def grouper(iterable, n, fillvalue=None):
        "Collect data into fixed-length chunks or blocks"
        # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
        args = [iter(iterable)] * n
        return zip_longest(*args, fillvalue=fillvalue)
    
    with open(filename, 'r') as infile:
        chunks_gen = grouper(infile, 3, fillvalue='')
        for chunk in chunks_gen:
            print("Name: {}Gender: {}Age: {}".format(*chunk))
    

    也打印

    Name: james
    Gender: male
    Age: 32
    
    Name: julie
    Gender: female
    Age: 29
    
    Name: mark
    Gender: male
    Age: 35
    

    【讨论】:

    • 这很有帮助,谢谢。我试试这个选项,inspectorG4dget 解决方案可以满足我的需要,但这绝对给了我一些新的工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2019-06-22
    • 2023-03-19
    相关资源
    最近更新 更多