在 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'])
我有要解析的文件。我想在每一行打印 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'])