这里的问题是您使用了
readlines()两次,这意味着第一次读取数据,然后第二次什么都没剩下。
您可以直接在文件上进行迭代,而无需使用
readlines()-实际上,这是更好的方法,因为它不会一次读取整个文件。
尽管可以通过按需使用来完成尝试做的事情
str.split(),但是更好的选择是使用为任务设计的
csv模块。
import csvwith 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优先考虑。通常在访问大量数据的地方(以及当您不知道列的顺序)使用它的次数更多,但是它使代码在此处易于阅读。但是,您可以只使用standard
csv.reader()。
接下来,我们遍历文件中的行,检查使用期限(将其转换为int以便进行数值比较)以知道要写入哪个文件。该
with语句为我们关闭了文件。
对于多个输入文件:
import csvfieldnames = ["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)我们只是添加一个循环来处理多个文件。请注意,我还添加了一个字段名称列表。在我只使用文件中的字段和顺序之前,但是由于我们有多个文件,因此我认为在此处执行此操作更为明智。一种替代方法是使用第一个文件来获取字段名称。



