拆分多行字符串并附加到新列表

时间:2015-03-25 15:55:30

标签: python

我有一个csv文件,其中包含一组记录。其中一列是多行字符串。我需要拆分这些行并复制主列表。例如,如果文件包含以下记录。

Row 1 - John, 2501, Admin/Partner/HR, TX
Row 2 - Max, 3489, Accountant/Admin/HR, MN

其中Admin/Partner/HRAccountant/Admin/HR是多行字符串。 我需要输出如下:

Row 1 - John, 2501, Admin, TX
Row 2 - John, 2501, Partner, TX
Row 3 - John, 2501, HR, TX
Row 4 - Max, 3489, Accountant, MN
Row 5 - Max, 3489, Admin, MN
Row 6 - Max, 3489, HR, MN

我尝试了以下功能

def splitrows(list_old,col):
  count = 0;
  array_new = []
  for row in list_old:
    splitArray = []
    splitarray = row[col].split('\n\n')
    if(len(splitarray)>0):
      for eachLine in splitarray:
        row[col] = eachLine
        array_new.append(row)


  return array_new

如果我使用追加,只会重复最后一行。如果我使用array_new + = row,那么每个列都会被拆分并添加到列表中,但我不希望这种情况发生。

提前致谢!

3 个答案:

答案 0 :(得分:2)

因为您解析的内容(几乎)是csv。您可以使用csv module

import csv

with open("test.csv") as f:
    # create a reader
    reader = csv.reader(f)
    for row in reader:
        # create a new row for each item in column 2
        for item in row[2].split('/'):
            # align items
            row[2] = ' ' + item.lstrip()
            print ','.join(row)

输出:

John, 2501, Admin, TX
John, 2501, Partner, TX
John, 2501, HR, TX
Max, 3489, Accountant, MN
Max, 3489, Admin, MN
Max, 3489, HR, MN

答案 1 :(得分:0)

@Reut Sharabani的回答是更好的,因为使用csv库比尝试滚动自己更清晰。话虽如此,我还想解释为什么你会看到你所看到的。

首先,你有一个让我担心你遇到案件问题的虚假行...... splitArray = []创建一个名为splitArray的空数组;你的下一行创建了一个名为splitarray的新数组,在python中,这是一个完全不同的变量。

更重要的是,当你执行row[col] = eachLine时,它会更改行值,然后当你追加它时,它实际上只附加对row的引用而不是副本,这样当你改变{{ 1}},您为附加到row的每个版本更改它。解决这个问题的最简单方法(这也是Reut的答案正在做的)是:

array_new

答案 2 :(得分:0)

ALGO:

  1. 使用csv模块读取和写入csv文件。
  2. 以写入模式读取输入文件和打开输出文件。
  3. 从输入文件中迭代每一行。
  4. 如果行中的第二项包含/,即多个值,则执行step 5,6,7,如果不是则执行step 8
  5. split()方法拆分字符串。
  6. for循环迭代每个分割值。
  7. 根据拆分值创建新行并写入输出文件。
  8. 将行写入输出文件。
  9. 输入: input.csv

    John, 2501, Admin/Partner/HR, TX
    Max, 3489, Accountant/Admin/HR, MN
    

    <强>代码:

    import csv
    
    input_file = "input.csv"
    output_file = "output.csv"
    
    #- Open File and read by csv module.
    with open(input_file, ) as fp:
        root = csv.reader(fp)
        #- Open File in write mode and write by csv module.
        with open(output_file, 'wb') as fp2:
            writer_root = csv.writer(fp2, delimiter=',')
    
            #- Iterate every row form the Input file.
            for row in root:
                #- check if second item from row contains / i.e. multiple values.
                if "/" in row[2]:
                    #- Split by /
                    tmp = row[2].split("/")
                    for i in tmp:
                        new_row = [row[0], row[1], i, row[3]]
                        print "Debug 1: ", new_row
                        #- Write Row in New file.
                        writer_root.writerow(new_row)
                else:
                        writer_root.writerow(row)
    

    <强>输出:

    调试声明:

    $ python 5.py 
    Debug 1:  ['John', ' 2501', ' Admin', ' TX']
    Debug 1:  ['John', ' 2501', 'Partner', ' TX']
    Debug 1:  ['John', ' 2501', 'HR', ' TX']
    Debug 1:  ['Max', ' 3489', ' Accountant', ' MN']
    Debug 1:  ['Max', ' 3489', 'Admin', ' MN']
    Debug 1:  ['Max', ' 3489', 'HR', ' MN']
    

    输出文件: output.csv

    John, 2501, Admin, TX
    John, 2501,Partner, TX
    John, 2501,HR, TX
    Max, 3489, Accountant, MN
    Max, 3489,Admin, MN
    Max, 3489,HR, MN