【问题标题】:split a list read in from file at the commas into a list of seperate elements将以逗号从文件中读取的列表拆分为单独元素的列表
【发布时间】:2017-07-20 13:13:37
【问题描述】:

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

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

例如,

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

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

要求的格式:1d 或 2d 列表,如下所示

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

我很高兴人们发布包括 reg ex 和 split string 在内的解决方案,因为它会帮助其他人,但是有没有更简单的方法?

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

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

【问题讨论】:

    标签: python list file split


    【解决方案1】:

    一旦构建了列表(或直接将文件句柄设为l,则无需先存储列表),我只需将rstripsplit 放在这样的列表理解中:

    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(",")]
    

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

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

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

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

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

    flat(这次使用itertools):

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

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

    【讨论】:

    • 这太棒了,谢谢。对于不想继续并循环遍历二维数组的初学者,您是否可以另外发布一个解决方案,该解决方案创建一个顺序包含所有元素的一维列表?
    • 另外,任何关于这是否是最 Pythonic、最简单的方法的 cmets 都将不胜感激。是直接从文件读取和操作,还是读入列表(构建列表)然后操作?
    • 最后,您能否扩展它(如果您明白我的意思,可以理解循环)并为那些不熟悉列表理解的人发表评论。 [v.rstrip().split(",") for v in myList]。非常感谢!
    • 您的回答表明 l 可以是句柄或行列表。你确定它可以是一个把手?我试过了,但没有用....newerlist=list(csv.reader(f)) print(newerlist) Error: TypeError: argument 1 must be an iterator
    • 是的,我确定。检查f 的类型。 csv.reader 更常用于打开文件而不是列表。
    【解决方案2】:

    这是 csv 模块的一个很好的用例:

    import csv
    
    with open("studentinfo.txt","r") as f:
        rd = csv.reader(f)
        lst = list(rd)    # lst is a list of lists in expected format
        ...               # further processing on lst
    

    或者,逐行处理文件很简单

    with open("studentinfo.txt","r") as f:
        rd = csv.reader(f)
        for row in rd:          # row is list of fields
            ...                 # further processing on row
    

    【讨论】:

    • 完美 - 这行得通。优雅的。 csv 阅读器是否会自动处理空格等内容。您能否评论一下此解决方案相对于先前答案的优雅之处?此外,您是否可以添加到您的答案中,以在一维列表和二维列表中显示结果,如图所示。
    • 我对 csv 有同样的想法,所以我编辑了我的帖子。 csv 处理这个的自然方式。我在工作中从不在逗号分隔的文件上使用split,但奇怪的是我总是在SO上用split回答...
    • with open("studentinfo.txt","r") as f: rd = csv.reader(f) for row in rd: newerlist=row print(newerlist) 这仍然会产生一个二维列表???
    • @MissComputing: 然后你可以将每一行附加到一个(最初为空的)列表中:lst = []rd = csv.reader(f)for row in reader:lst.extend(row)
    • @MissComputing:列表必须在进入for循环之前进行初始化,并且只能在其中进行扩展。您当前的repl 在每一行重置它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多