【问题标题】:How to separate based on multiple delimitors (consecutive whitespaces)如何根据多个分隔符(连续的空格)进行分隔
【发布时间】:2021-04-29 03:53:31
【问题描述】:

我有一个像这样的 txt

Layer_00 : 3.46ms   Layer_01 : 3.40ms   Layer_02 : 3.56ms   Layer_03 : 3.49ms   Layer_04 : 3.44ms
Layer_05 : 3.45ms   Layer_06 : 3.44ms   Layer_07 : 3.46ms   Layer_08 : 3.45ms   Layer_09 : 3.48ms
Layer_10 : 3.48ms   Layer_11 : 3.48ms   Layer_12 : 3.57ms   Layer_13 : 3.54ms   Layer_14 : 3.60ms
Layer_15 : 3.58ms   Layer_16 : 3.59ms   Layer_17 : 3.57ms   Layer_18 : 3.55ms   Layer_19 : 3.57ms
Layer_20 : 3.58ms   Layer_21 : 3.57ms   Layer_22 : 3.52ms   Layer_23 : 3.56ms   Layer_24 : 3.47ms

我想用 ':' 和 3 个连续的空格分隔它们
有谁知道如何实现它?
我试过了

pd.read_csv('text.txt', sep = '[:,   ]', header = None) 

但它似乎不起作用。

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    只需手动处理它们。 pandas.read_csv 很方便,但它仅在您的数据恰好与它可以读取的格式匹配时才有效。

    import re
    data = []
    for line in open('text.txt'):
        data.append( re.split(r'\s[\s:]\s', line.rstrip()) )
    df = pd.DataFrame(data)
    

    【讨论】:

      【解决方案2】:

      此数据看起来不像 csv,因为没有标题和列。它看起来更像是一个键/值对列表。您可以尝试解析文件并使用正则表达式分隔对:

      import re
      with open('text.txt', 'r') as file:
          pairs = re.findall('(Layer_\d+)\s:\s(\d+\.\d+)ms', file.read())
      pairs = [(k, float(v)) for k,v in pairs]
      df = pd.DataFrame(pairs)
      

      这将给出一个看起来像这样的df:

                 0     1
      0   Layer_00  3.46
      1   Layer_01  3.40
      2   Layer_02  3.56
      3   Layer_03  3.49
      4   Layer_04  3.44
      5   Layer_05  3.45
      6   Layer_06  3.44
      7   Layer_07  3.46
      8   Layer_08  3.45
      9   Layer_09  3.48
      10  Layer_10  3.48
      11  Layer_11  3.48
      12  Layer_12  3.57
      13  Layer_13  3.54
      14  Layer_14  3.60
      15  Layer_15  3.58
      16  Layer_16  3.59
      17  Layer_17  3.57
      18  Layer_18  3.55
      19  Layer_19  3.57
      20  Layer_20  3.58
      21  Layer_21  3.57
      22  Layer_22  3.52
      23  Layer_23  3.56
      24  Layer_24  3.47
      

      【讨论】:

        【解决方案3】:

        您非常接近,只是“sep”参数将与引擎参数一起以另一种方式定义。
        一种方法是为 sep 提供不同的分隔符。

        两种解决方案

        使用正则表达式

        pd.read_csv('text.txt', engine='python', sep=r"\s*:\s*|\s+", header = None)
        

        没有正则表达式

        pd.read_csv('text.txt', engine='python', sep="   | : ", header = None)
        

        输出

            0           1       2           3       4   5   6   7   8   9
        0   Layer_00    3.46ms  Layer_01    3.40ms  Layer_02    3.56ms  Layer_03    3.49ms  Layer_04    3.44ms
        1   Layer_05    3.45ms  Layer_06    3.44ms  Layer_07    3.46ms  Layer_08    3.45ms  Layer_09    3.48ms
        2   Layer_10    3.48ms  Layer_11    3.48ms  Layer_12    3.57ms  Layer_13    3.54ms  Layer_14    3.60ms
        3   Layer_15    3.58ms  Layer_16    3.59ms  Layer_17    3.57ms  Layer_18    3.55ms  Layer_19    3.57ms
        4   Layer_20    3.58ms  Layer_21    3.57ms  Layer_22    3.52ms  Layer_23    3.56ms  Layer_24    3.47ms
        

        【讨论】:

          猜你喜欢
          • 2019-05-05
          • 1970-01-01
          • 2013-08-19
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          • 2013-10-19
          相关资源
          最近更新 更多