Skip to main content
 首页 » 编程设计

python之将逗号处从文件读入的列表拆分为单独元素的列表

2025年05月04日13lyhabc

读入文件内容的问题在于,当读入列表时,它会将其格式化为一个大字符串。学生需要能够使用文件中的这种“读取”数据,以隔离 ID 号,并返回学生(例如)。

我知道有几种方法可以做到这一点,例如,正则表达式、转换为字符串和使用 split 方法,但出于教学目的,我会对最简单、最优雅的方法(以及通过优雅,我的意思是避免多个不必要的步骤)。理想情况下,有没有办法以所需格式直接从文本文件中将其读入列表:

例如,

而不是当前格式(其中还包括我需要删除的\n):

['001,Joe,Bloggs,Test1:99,Test2:100,Test3:33\n', '002,Ash,Smith,Test1:22,Test2:63,Test3:99\n'] 

要求的格式:一维或二维列表,如下所示

[['001','Joe','Bloggs','Test1:99','Test2:100','Test3:33'],['002','Ash','Smith','Test1:22','Test2:63','Test3:99']] 

我很高兴人们发布包括 reg ex 和拆分字符串在内的解决方案,因为它会帮助其他人,但有没有办法更简单地做到这一点?

带有文本文件的完整代码 list (在线复制:

https://repl.it/J8jB/2

代码:

f = open("studentinfo.txt","r")  
myList = [] 
for line in f: 
    myList.append(line) 
print(myList) 
print() 
print() 
print(myList[0]) 
myList.split(",") 
print(myList) 
 
#split the list where all the individual elements in the current string (in the list) are split up at the "," 

文本文件:

001,Joe,Bloggs,Test1:99,Test2:100,Test3:33 
002,Ash,Smith,Test1:22,Test2:63,Test3:99 

请您参考如下方法:

一旦构建了列表(或者直接将文件句柄作为 l,就不需要先存储列表)我只需要 rstrip 和 split 在这样的列表理解中:

l = ['001,Joe,Bloggs,Test1:99,Test2:100,Test3:33\n', '002,Ash,Smith,Test1:22,Test2:63,Test3:99\n'] 
 
newl = [v.rstrip().split(",") for v in l] 
 
print(newl) 

结果:

[['001', 'Joe', 'Bloggs', 'Test1:99', 'Test2:100', 'Test3:33'], ['002', 'Ash', 'Smith', 'Test1:22', 'Test2:63', 'Test3:99']] 

对于平面列表,改为执行双循环(或使用 itertools.chain.from_iterable,有很多方法可以做到这一点):

newl = [x for v in l for x in v.rstrip().split(",")] 

没有 listcomp(只是为了“可读性”,当你不习惯 listcomps 之后,切换到 listcomps :)):

newl = [] 
for v in l: 
    newl.append(v.rstrip().split(",")) 

(使用extend 而不是append 来获得平面列表)

当然,我总是忘记提及 csv,它的默认分隔符为逗号并去除换行符:

import csv 
newl = list(csv.reader(l)) 

平坦(这次使用 itertools):

newl = list(itertools.chain.from_iterable(csv.reader(l))) 

(l 可以是文件句柄或 csv 模块的行列表)