这里的问题是您使用了readlines()两次,这意味着第一次读取数据,第二次则什么都不剩。
您可以不使用readlines()直接在文件上迭代-事实上,这是更好的方法,因为它不会一次读取整个文件。
虽然您可以使用str.split()来完成您想要做的事情,但是更好的选择是使用the ^{} module,这是为任务设计的。import csv
with open("addressbook1.txt") as input, open("college_age.txt", "w") as college, open("adult_age.txt", "w") as adult:
reader = csv.DictReader(input, dialect="excel-tab")
fieldnames = reader.fieldnames
writer_college = csv.DictWriter(college, fieldnames, dialect="excel-tab")
writer_adult = csv.DictWriter(adult, fieldnames, dialect="excel-tab")
writer_college.writeheader()
writer_adult.writeheader()
for row in reader:
if int(row["Age"]) < 23:
writer_college.writerow(row)
else:
writer_adult.writerow(row)
那我们在这里干什么?首先,我们使用the ^{} statement表示opening files。它不仅更加python和可读性,而且可以处理关闭,即使出现异常。
接下来我们创建一个DictReader,它将从文件中读取行作为字典,并自动使用第一行作为字段名。然后,我们让writer写回被拆分的文件,并写入头。使用DictReader是一个偏好问题。在经常访问数据的地方(以及不知道列的顺序时),它通常使用得更多,但它使代码在这里可读性更好。不过,您可以使用标准的csv.reader()。
接下来,我们循环遍历文件中的行,检查age(我们将其转换为int以便进行数值比较)以知道要写入哪个文件。with语句为我们关闭文件。
对于多个输入文件:import csv
fieldnames = ["Name", "Date", "Age", "Sex", "Color"]
filenames = ["addressbook1.txt", "addressbook2.txt", ...]
with open("college_age.txt", "w") as college, open("adult_age.txt", "w") as adult:
writer_college = csv.DictWriter(college, fieldnames, dialect="excel-tab")
writer_adult = csv.DictWriter(adult, fieldnames, dialect="excel-tab")
writer_college.writeheader()
writer_adult.writeheader()
for filename in filenames:
with open(filename, "r") as input:
reader = csv.DictReader(input, dialect="excel-tab")
for row in reader:
if int(row["Age"]) < 23:
writer_college.writerow(row)
else:
writer_adult.writerow(row)
我们只需添加一个循环来处理多个文件。请注意,我还添加了一个字段名列表。在我使用字段和文件中的顺序之前,但是由于我们有多个文件,所以我认为在这里这样做更为明智。另一种方法是使用第一个文件获取字段名。