【问题标题】:How to parse/format a string of tuples?如何解析/格式化一串元组?
【发布时间】:2013-04-04 06:12:25
【问题描述】:

我刚刚写了一个成绩计算程序,到最后几行......我有这个元组字符串:

"('Jetson Elroy', '45', '88', '88', '70', 0.7253846153846155, 'C', 'Not Passible', 0.9385714285714284, 0.6528571428571427, 0.367142857142857), ('Joe Kunzler', '99', '88', '77', '55', 0.7699999999999999, 'C', 'Not Passible', 0.8557142857142858, 0.5700000000000001, 0.28428571428571436), ('Harris Jones', '77', '99', '47', '77', 0.7115384615384616, 'C', 'Not Passible', 0.9642857142857143, 0.6785714285714286, 0.39285714285714285)"

我想让每个学生及其分数逐行打印到我的文本文件中,例如:

'Jetson', '45', '88', '88', '70', 0.7253846153846155, 'C', 'Not Passible', 0.9385714285714284, 0.6528571428571427, 0.367142857142857

'Joe', '99', '88', '77', '55', 0.7699999999999999, 'C', 'Not Passible', 0.8557142857142858, 0.5700000000000001, 0.28428571428571436

'Harris Jones', '77', '99', '47', '77', 0.7115384615384616, 'C', 'Not Passible', 0.9642857142857143, 0.6785714285714286, 0.39285714285714285

我试过了:

m=open('GradeAnalysis.txt', 'r+')
m.write (print i for i in ourlist)
m.close()

但我知道如果你想使用 m.write(),你必须有一个字符串。然后我将我的列表转移到上面的元组字符串中。任何 pythonic 建议表示赞赏。

【问题讨论】:

    标签: python string list csv format


    【解决方案1】:

    使用str.join()csv module 写入数据。

    使用','.join(str(i) for i in ourlist) 创建一个逗号分隔的字符串来写入文件,但由于这确实是CSV 数据,csv 模块可能更适合。

    import csv
    
    with open('GradeAnalysis.txt', 'rb') as out:
        writer = csv.writer(out)
        for row in list_of_sequences:
            out.writerow(row)        
    

    其中list_of_sequences 是一个包含其他列表或元组的列表;例如:

    list_of_sequences = [(1, 2, 3), ('foo', 'bar', 'baz')]
    

    【讨论】:

      【解决方案2】:

      join() 可以是一个简单的解决方案:

      m.write('\n'.join(i for i in ourstring))
      

      编辑:由于ourstring不是字符串列表而是字符串,所以可以使用正则表达式来获取表示元组的字符串

      import re
      
      ourstring = "('Jetson Elroy', '45', '88', '88', '70', 0.7253846153846155, 'C', 'Not Passible', 0.9385714285714284, 0.6528571428571427, 0.367142857142857), ('Joe Kunzler', '99', '88', '77', '55', 0.7699999999999999, 'C', 'Not Passible', 0.8557142857142858, 0.5700000000000001, 0.28428571428571436), ('Harris Jones', '77', '99', '47', '77', 0.7115384615384616, 'C', 'Not Passible', 0.9642857142857143, 0.6785714285714286, 0.39285714285714285)"
      tuples = re.findall(r'\((.+?)\)', ourstring) # (.+?) to perform a non-greedy match - important!
      m.write ('\n'.join(t for t in tuples))
      

      【讨论】:

      • 不幸的是,这会为字符串中的每个字符打印一行 ' \n 'j'\n 'e'\n't'\n
      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多