【问题标题】:looping with comma and - as delimiter python用逗号循环和 - 作为分隔符 python
【发布时间】:2014-02-10 21:55:07
【问题描述】:

我正在努力编写以下 python 脚本。 我有一个看起来像这样的csv 文件

"SNo","Title1","Title2"
"A1-A3,A4-A5","A,B","C"
"A6-A7","X","Y"
"A8","Z","D"

输出应该是应该产生的 csv 文件

"SNo","Title1","Title2"
"A1","A,B","C"
"A2","A,B","C"
"A3","A,B","C"
"A4","A,B","C"
"A5","A,B","C"
"A6","X","Y"
"A7","X","Y"
"A8","Z","D"

我正在阅读文件

cols= [0,1,2]
with open('C:\\down\\1\\list.csv','rb') as f:
    reader = csv.reader(f)
    for row in reader:
        content = list(row[i] for i in cols)
        numberlist =  content[0].replace("A","").split(",")
        print numberlist[0],content[1],content[2]

但我正在努力超越这一点。 请告诉我一个解决这个问题的好方法。

谢谢

【问题讨论】:

    标签: python csv delimiter


    【解决方案1】:

    你可以试试这个:

    output_arr = []
    for row in reader:
        # Get the mapping for A ranges
        idx_map = row[0].replace("A","").split(",")
        for row_map in idx_map:
                # For each pair or #-#'s creating the min and max idxs
                mapping = [int(v) for v in row_map.split('-')]
                min_map = min(mapping)
                max_map = max(mapping)
                for idx in range(min_map,max_map+1):
                        # For each value in range min_map to max_map, set values of row.
                        output_arr.append(["A%i"%(idx),row[1],row[2]])
    
    >>> import pprint
    >>> pprint.pprint(output_arr)
    [['A1', 'A,B', 'C'],
     ['A2', 'A,B', 'C'],
     ['A3', 'A,B', 'C'],
     ['A4', 'A,B', 'C'],
     ['A5', 'A,B', 'C'],
     ['A6', 'X', 'Y'],
     ['A7', 'X', 'Y'],
     ['A8', 'Z', 'D']]
    

    这将处理以下异常:“A3-A1”

    【讨论】:

      【解决方案2】:

      假设 data 是一个列表,其中包含来自您的 csv 文件的数据:

      data = [["A1-A3,A4-A5","A,B","C"],
              ["A6-A7","X","Y"],
              ["A8","Z","D"]]
      
      for line in data:
          head, tail = line[0], line[1:]
          for range_ in head.split(","):
              try:
                  from_, to = range_.split("-")
                  c, n, m = from_[0], int(from_[1:]), int(to[1:])
                  for i in range(n, m+1):
                      print c + str(i), tail
              except:
                  print range_, tail
      

      输出:

      A1 ['A,B', 'C']
      A2 ['A,B', 'C']
      A3 ['A,B', 'C']
      A4 ['A,B', 'C']
      A5 ['A,B', 'C']
      A6 ['X', 'Y']
      A7 ['X', 'Y']
      A8 ['Z', 'D']
      

      【讨论】:

        【解决方案3】:

        我想这可以作为一个起点:

        with open('list.csv','rb') as f, open('res.csv', 'wb') as f2:
            reader = csv.reader(f)
            writer = csv.writer(f2)
            for row in reader:
                for group in row[0].split(','):
                    limits = group.split('-')
                    if len(limits) == 2:
                        id1, id2 = [int(x[1:]) for x in limits]
                        for num in range(id1, id2+1):
                            writer.writerow(("A{}".format(num),row[1],row[2]))
                    else:
                        writer.writerow((group,row[1],row[2]))
        

        如果你想要你发布的确切输出格式,你需要稍微调整一下。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          • 2015-08-31
          • 1970-01-01
          • 2017-09-30
          • 2016-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多