这里的问题是您使用了readlines()
两次,这意味着第一次读取数据,然后第二次什么都没剩下。
您可以直接在文件上进行迭代,而无需使用readlines()
-实际上,这是更好的方法,因为它不会一次读取整个文件。
尽管可以通过按需使用来完成尝试做的事情str.split()
,但是更好的选择是使用为任务设计的csv
模块。
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)
那我们在这里做什么?首先我们使用的with
语句用于打开文件。它不仅更具Python可读性,而且即使在发生异常时也可以为您处理关闭。
接下来,我们创建一个DictReader
从文件中读取作为字典的行,自动使用第一行作为字段名。然后,我们让编写者写回我们的拆分文件,并将标头写入其中。使用DictReader
优先考虑。通常在访问大量数据的地方(以及当您不知道列的顺序)使用它的次数更多,但是它使代码在此处易于阅读。但是,您可以只使用standardcsv.reader()
。
接下来,我们遍历文件中的行,检查使用期限(将其转换为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)
我们只是添加一个循环来处理多个文件。请注意,我还添加了一个字段名称列表。在我只使用文件中的字段和顺序之前,但是由于我们有多个文件,因此我认为在此处执行此操作更为明智。一种替代方法是使用第一个文件来获取字段名称。