【问题标题】:Python : can't extract correctly a csv file [closed]Python:无法正确提取 csv 文件 [关闭]
【发布时间】:2021-10-23 12:51:15
【问题描述】:

我必须在 python 中使用 csv 文件。他看起来像这样:

61979.521351 1 41 -91 2050 61979.521351 2 -10 -8 4 61979.526329 1 42 -96 2070 61979.526329 2 -17 -6 4 61979.531307 1 44 -88 2070 61979.531307 2 -12 -8 3 61979.536285 1 44 -101 2074 61979.536285 2 -13 -7 8 61979.541263 1 47 -99 2050

当数据没有用逗号分隔并且我们没有任何标题时,我不知道如何从 csv 文件中提取数据。 有人可以帮我吗?

【问题讨论】:

    标签: python csv extract


    【解决方案1】:

    尝试指定分隔符和标头参数:

    import pandas as pd
    data = pd.read_csv('path_to_file', delimiter = ' ', header = None, names = colnames)
    

    这里,colnames 是一个包含您想要的列名的列表

    【讨论】:

      【解决方案2】:

      一般:

      d = ' '
      
      with open('data.dat', 'r') as f:
          data = [x.split(d) for x in f.read().splitlines()]
      

      您会得到一个嵌套列表,其中包含顶层的行和底层的字段。

      【讨论】:

        【解决方案3】:

        您可以这样使用csv 模块:

        import csv
        
        with open('test.csv', newline='') as csvfile:
            rdr = csv.reader(csvfile, delimiter=' ')
            for row in rdr:
                # Remove or comment out the following line to keep each row element as a string:
                row = [float(elem) for elem in row]
                print(row)
        

        打印:

        [61979.521351, 1.0, 41.0, -91.0, 2050.0, 61979.521351, 2.0, -10.0, -8.0, 4.0, 61979.526329, 1.0, 42.0, -96.0, 2070.0]
        [61979.526329, 2.0, -17.0, -6.0, 4.0, 61979.531307, 1.0, 44.0, -88.0, 2070.0, 61979.531307, 2.0, -12.0, -8.0, 3.0]
        [61979.536285, 1.0, 44.0, -101.0, 2074.0, 61979.536285, 2.0, -13.0, -7.0, 8.0, 61979.541263, 1.0, 47.0, -99.0, 2050.0]
        

        更新

        如果要将所有数据作为行保留在列表中,其中行的每个元素都可以通过列名进行索引,那么:

        import csv
        
        column_names = list('ABCDEFGIHJKLMNO') # 'A', 'B', ... 'O'
        data = []
        with open('test.csv', newline='') as csvfile:
            rdr = csv.DictReader(csvfile, fieldnames=column_names, delimiter=' ')
            data = [{k: float(v) for k, v in row.items()} for row in rdr]
            # Or: data = [row for row in rdr] # to keep everything as strings
        print(data[2]['F'])
        

        打印:

        61979.536285
        

        以上提供了pandas 的轻量级替代方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-11
          • 1970-01-01
          • 1970-01-01
          • 2013-03-19
          • 1970-01-01
          • 2014-07-28
          • 2023-03-10
          相关资源
          最近更新 更多