在 python 中使用 readlines 和 split 函数解析文件

Parsing a file with readlines and split function in python

我有要解析的文件。我想在每一行打印 date_of_birth 。下面的代码只有 returns 第一行。我不想使用 readlines,因为我的一些文件非常大。

HEADER: Date_of_birth, ID, First_Name, Last_Name
1/1/1970, 1, John, Smith
12/31/1969, 2, Peter, Smith
with open("test.csv", "r") as f:
    lines = f.readline().split[0]
    print(lines)

对不起我的错误 检查这个

dates = []
with open("test.csv") as f:
    for row in f:
        dates.append(row.split()[0])

使用csv模块

import csv
with open("test.csv", "r") as f:
    reader = csv.DictReader(f)
    for line in reader:
        print(line['Date_of_birth'])

如果第一行实际上不包含您显示为 Header 的内容,即 Date_of_birth, ID, First_Name, Last_Name,则:

import csv

with open("test.csv", "r", newline='') as f:
    fieldnames = ['Date_of_birth', 'ID', 'First_Name', 'Last_Name']
    rdr = csv.DictReader(f, fieldnames=fieldnames)
    for row in rdr:
       date_of_birth = row['Date_of_birth']
       print(date_of_birth)

否则:

import csv

with open("test.csv", "r", newline='') as f:
    rdr = csv.DictReader(f)
    for row in rdr:
       date_of_birth = row['Date_of_birth']
       print(date_of_birth)

如果文件的第一行实际上包含 HEADER: Date_of_birth, ID, First_Name, Last_Name,那么您必须使用第一个替代代码,但添加逻辑以跳过第一行。

如果你的清晰度提高 10%,我的回答会缩短 60%。

readline函数returns一次只有一行,所以你必须使用while循环来读取行:

with open("test.csv", "r") as f:
    dates = []
    while True:
        line = f.readline()
        if not line:  # if line is blank, there are no more lines
            break  # stop the loop
        dates.append(line.split()[0])

我建议使用 csv 模块,尽管您的文件格式有点奇怪,因为它以 "HEADER: " 开头,后跟您关心的实际 headers。也许只是读入那些最初的 8 个字节,验证它们确实包含字符串 "HEADER: ",否则丢弃它们,然后将打开的文件句柄传递给 csv 以解析文件的其余部分。

这是一个简单的示例,您可能希望对其进行调整以更优雅地处理任何错误:

import csv
with open('test.csv') as f:

    start_bytes = f.read(8)
    assert(start_bytes == 'HEADER: ')

    c = csv.reader(f)

    header_row = next(c)
    column_number = header_row.index('Date_of_birth')

    for row in c:
        print(row[column_number])

更新:感谢另一位贡献者的建议 csv.DictReader。类似地,您似乎可以使用位于某个 non-zero 偏移量的文件 object 来实例化它,以从文件开头丢弃包含 "HEADER: " 的初始字节。

import csv
with open('test.csv') as f:

    start_bytes = f.read(8)
    assert(start_bytes == 'HEADER: ')

    c = csv.DictReader(f)
    for row in c:
        print(row['Date_of_birth'])