【问题标题】:Converting CSV to List results in lists within list将 CSV 转换为列表会在列表中生成列表
【发布时间】:2017-05-13 02:13:26
【问题描述】:

我正在尝试将以下 Unicode 字符串转换为列表 [我在其中添加了两个空格以使其适合...]:

"58478000","","NEW","2016-12-28T14:34:18","C","","","N","N","ON","2017-03-15","2022-03-15","30/360","EUR","IR","","InterestRate:IRSwap:FixedFloat","Trade","EUR-EURIBOR-Reuters","FIXED","Percent","-0.003","","","EUR","EUR","25,000,000","25,000,000","3M","1Y","3M","","","","","","","","","","","","",""

我使用以下代码将上面的字符串 abc 转换为列表:

csv.reader(abc, delimiter=',')
details = list(csvreader)

这导致了这个结果,我似乎无法轻易放弃['','']...

[['58478000'], ['', ''], [''], ['', ''], ['NEW'], ['', ''],['2016-12-28T14:34:18'], ['', ''], ['C'], ['', ''], [''], ['', ''],[''], ['', ''], ['N'], ['', ''], ['N'], ['', ''], ['ON'], ['', ''],['2017-03-15'], ['', ''], ['2022-03-15'], ['', ''], [' 30/360'], ['',''], ['EUR'], ['', ''], ['IR'], ['', ''], [''], ['', ''],['InterestRate:IRSwap:FixedFloat'], ['', ''], ['Trade'], ['', ''],['EUR-EURIBOR-Reuters'], ['', ''], ['FIXED'], ['', ''], ['Percent'],['', ''], ['-0.003'], ['', ''], [''], ['', ''], [''], ['', ''],['EUR'], ['', ''], ['EUR'], ['', ''], ['25,000,000'], ['', ''],['25,000,000'], ['', ''], ['3M'], ['', ''], ['1Y'], ['', ''], ['3M'],['', ''], [''], ['', ''], [''], ['', ''], [''], ['', ''], [''], ['',''], [''], ['', ''], [''], ['', ''], [''], ['', ''], [''], ['', ''],[''], ['', ''], [''], ['', ''], [''], ['', ''], [''], ['', ''], ['']]

我的目标是将其放入某种列表或任何其他集合中,以便更轻松地从中提取信息...

【问题讨论】:

    标签: python csv


    【解决方案1】:

    你很亲密。 documentation 中有一些关于字符串支持的内容:

    虽然该模块不直接支持解析字符串,但可以轻松完成:

    import csv
    for row in csv.reader(['one,two,three']):
        print(row)
    

    注意字符串周围的[]。如果没有这些大括号,csv 模块似乎每个元素返回 1 行,但这似乎没有记录。

    由于我一开始并不知道文档中的上述部分,所以我的第一个“实用”方法是使用列表理解来获取行内的元素:

    import csv
    
    abc = '"58478000","","NEW","2016-12-28T14:34:18","C","","","N","N","ON","2017-03-15","2022-03-15","30/360","EUR","IR","","InterestRate:IRSwap:FixedFloat","Trade","EUR-EURIBOR-Reuters","FIXED","Percent","-0.003","","","EUR","EUR","25,000,000","25,000,000","3M","1Y","3M","","","","","","","","","","","","",""'
    
    csvreader=csv.reader(abc, delimiter=',')
    details = [x[0] for x in csvreader]
    print(details)
    

    产量:

    ['58478000', '', '', '', 'NEW', '', '2016-12-28T14:34:18', '', 'C', '', '', '', '', '', 'N', '', 'N', '', 'ON', '', '2017-03-15', '', '2022-03-15', '', '30/360', '', 'EUR', '', 'IR', '', '', '', 'InterestRate:IRSwap:FixedFloat', '', 'Trade', '', 'EUR-EURIBOR-Reuters', '', 'FIXED', '', 'Percent', '', '-0.003', '', '', '', '', '', 'EUR', '', 'EUR', '', '25,000,000', '', '25,000,000', '', '3M', '', '1Y', '', '3M', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
    

    通过这种方法,我们必须去除空字符串(这只是一种解决方法),如果我们需要它们完整无缺,顺便说一句,我们会被卡住:

    details = [x[0] for x in csvreader if x[0]]
    

    结果:

    ['58478000', 'NEW', '2016-12-28T14:34:18', 'C', 'N', 'N', 'ON', '2017-03-15', '2022-03-15', '30/360', 'EUR', 'IR', 'InterestRate:IRSwap:FixedFloat', 'Trade', 'EUR-EURIBOR-Reuters', 'FIXED', 'Percent', '-0.003', 'EUR', 'EUR', '25,000,000', '25,000,000', '3M', '1Y', '3M']
    

    但是在阅读了文档之后,正确的做法是:

    import csv
    
    abc = '"58478000","","NEW","2016-12-28T14:34:18","C","","","N","N","ON","2017-03-15","2022-03-15","30/360","EUR","IR","","InterestRate:IRSwap:FixedFloat","Trade","EUR-EURIBOR-Reuters","FIXED","Percent","-0.003","","","EUR","EUR","25,000,000","25,000,000","3M","1Y","3M","","","","","","","","","","","","",""'
    
    csvreader=csv.reader([abc], delimiter=',') # pass a list of 1 element
    details = list(csvreader)[0]
    print(details)
    

    result(注意现在考虑空字符串的数量):

    ['58478000', '', 'NEW', '2016-12-28T14:34:18', 'C', '', '', 'N', 'N', 'ON', '2017-03-15', '2022-03-15', '30/360', 'EUR', 'IR', '', 'InterestRate:IRSwap:FixedFloat', 'Trade', 'EUR-EURIBOR-Reuters', 'FIXED', 'Percent', '-0.003', '', '', 'EUR', 'EUR', '25,000,000', '25,000,000', '3M', '1Y', '3M', '', '', '', '', '', '', '', '', '', '', '', '', '']
    

    如果我们想删除空字符串,让我们用一个列表推导来做,比另一个简单:

    csvreader=csv.reader([abc], delimiter=',')
    details = [x for x in list(csvreader)[0] if x]
    print(details)
    

    结果:

    ['58478000', 'NEW', '2016-12-28T14:34:18', 'C', 'N', 'N', 'ON', '2017-03-15', '2022-03-15', '30/360', 'EUR', 'IR', 'InterestRate:IRSwap:FixedFloat', 'Trade', 'EUR-EURIBOR-Reuters', 'FIXED', 'Percent', '-0.003', 'EUR', 'EUR', '25,000,000', '25,000,000', '3M', '1Y', '3M']
    

    【讨论】:

    • 嗨,我正在尝试这个回复。效果很好 - 谢谢!
    • 关于您的编辑 - 我不确定我是否遵循。如果 x[0]] 不起作用,原始详细信息 = [x[0] for x in csvreader 是否有效?对我来说似乎
    • 它工作不用担心。我只是在寻找更优雅的东西。
    • @keynesiancross 检查我的最后一次编辑。似乎我们利用了一些未记录的功能。
    【解决方案2】:

    一旦你有了 CSV 行,你就可以简单地使用

    result = abc.split(",") 
    

    要使列表避免使用逗号作为元素(您的方法似乎是使用引号作为字符串分隔符。

    另外,使用 csv 库本身,this question 会有所帮助。

    >>> import csv
    
    >>> with open(name, 'rb') as f:
    ...     for row in csv.reader(abc, delimiter=',', skipinitialspace=True):
    ...             result = row
    

    那里的答案说应该自动处理引号,而this answer 说您将行作为列表!

    【讨论】:

    • 如果某些元素包含逗号怎么办?直接传递abc 是无证的/不受支持的。
    【解决方案3】:

    因为你只有一个字符串,你需要把它放在一个可迭代对象中,比如list,这样csv.reader 才能正确读取它。

    import csv
    
    abc = (u'"58478000","","NEW","2016-12-28T14:34:18","C","","","N","N","ON",'
           u'"2017-03-15","2022-03-15","30/360","EUR","IR","",'
           u'"InterestRate:IRSwap:FixedFloat","Trade","EUR-EURIBOR-Reuters","FIXED",'
           u'"Percent","-0.003","","","EUR","EUR","25,000,000","25,000,000","3M",'
           u'"1Y","3M","","","","","","","","","","","","",""')
    
    reader = csv.reader([abc], delimiter=',')
    details = next(reader)  # read and process single line that is in list [abc]
    print(details)
    

    输出:

    ['58478000', '', 'NEW', '2016-12-28T14:34:18', 'C', '', '', 'N', 'N', 'ON', '2017-03-15', '2022-03-15', '30/360', 'EUR', 'IR', '', 'InterestRate:IRSwap:FixedFloat', 'Trade', 'EUR-EURIBOR-Reuters', 'FIXED', 'Percent', '-0.003', '', '', 'EUR', 'EUR', '25,000,000', '25,000,000', '3M', '1Y', '3M', '', '', '', '', '', '', '', '', '', '', '', '', '']

    【讨论】:

    • 嗨,当我尝试这个时,我得到:“58478000”只有
    • 我只能说我没有(在 Python 2 和 3 中)。也许您在我的答案中的代码中遗漏了一些东西。确保您有以下行:reader = csv.reader([abc], delimiter=',')[abc] 部分很重要。
    • 你知道吗,就是这样。字符串周围的额外 []
    【解决方案4】:

    如果第一个输入是一个字符串,可以使用ast.literal_eval()

    >>> import ast
    >>> 
    >>> s = '"58478000","","NEW","2016-12-28T14:34:18","C","",""'
    >>> list(ast.literal_eval(s))
    ['58478000', '', 'NEW', '2016-12-28T14:34:18', 'C', '', '']
    

    如果你想扁平化你的结果,你可以使用:

    >>> import itertools
    >>> 
    >>> my_list = [['58478000'], ['', ''], [''], ['', ''], ['NEW'], ['', ''], ['2016-12-28T14:34:18'], ['', ''], ['C'], ['', ''], ['']]
    >>>
    >>> list(itertools.chain.from_iterable(my_list))
    ['58478000', '', '', '', '', '', 'NEW', '', '', '2016-12-28T14:34:18', '', '', 'C', '', '', '']
    

    【讨论】:

      【解决方案5】:

      你试过 string.split(',') 吗?

      【讨论】:

        猜你喜欢
        • 2015-04-01
        • 1970-01-01
        • 2016-01-15
        • 2017-10-16
        • 2017-05-13
        • 2016-11-30
        • 2019-12-17
        相关资源
        最近更新 更多