【问题标题】:Parse csv string into columns in python将csv字符串解析为python中的列
【发布时间】:2017-04-26 20:46:13
【问题描述】:

我有一个包含两列的 csv 文件。第一个是 stringID,而第二个是 stringID 列表。

第 1 列 |第 2 列

aaa | [u'xxx', u'yyy']

我的问题是如何使用 stringID 成对创建一个新的 csv(两列重复)?例如,

第 1 列 |第 2 列

aaa |你'xxx'

aaa |呸呸呸

非常感谢您帮助我!我知道这个问题应该很简单,但是这几天一直困扰着我……

【问题讨论】:

  • 如果这几天一直困扰您,您应该尝试一些代码。请与我们分享。
  • 您能否将您的代码提供给我们,以便我们为您提供帮助?我们不是来为您工作的。

标签: python csv parsing


【解决方案1】:

感谢您的建设性回答!虽然它并不特别适合我,但我确实受到了它的启发并想出了一些功能代码!

header = True

with open('2.csv') as inCSV:
writer = csv.writer(open('1.csv', 'wb'))
for line in inCSV.readlines():
    column1, column2 = [_.strip() for _ in line.split(',',1)]
    if header:
        writer.writerow(('source','target'))
        header = False
    else:
        temp=column2.replace("[","]").replace("]","").replace('"','').split(",")
        for i in range(len(temp)):
            data=(column1,temp[i])
            writer.writerow(data)

【讨论】:

    【解决方案2】:

    此代码忽略了可以使用 csv 样式处理的可能性,因为我不确定字段是如何分隔的。我假设它们用“|”分隔字符,并且可能有必要去除空格。我利用评论使用ast.literal_eval 来安全处理列表。

    >>> from io import StringIO
    >>> import ast
    >>> inputCSV = StringIO('''\
    ... Column1 | Column2
    ... aaa | [u'xxx', u'yyy']
    ... bbb | [u'sss', u'ttt']''')
    >>> header = True
    >>> with inputCSV as inCSV:
    ...     for line in inCSV.readlines():
    ...         
    ...         column1, column2 = [_.strip() for _ in line.split('|')]
    ...         
    ...         
    ...         if header:
    ...             print ('%s|%s' % (column1, column2))
    ...             header = False
    ...         else:
    ...             column2 = ast.literal_eval(column2)
    ...             
    ...             for item in column2:
    ...                 print ('%s|%s' % (column1, item))
    ... 
    Column1|Column2
    aaa|xxx
    aaa|yyy
    bbb|sss
    bbb|ttt
    

    【讨论】:

    • 使用eval() 几乎总是错误的选择。 ast.literal_eval() 也能正常工作,同时更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    相关资源
    最近更新 更多