代码之家  ›  专栏  ›  技术社区  ›  Liris

python-读取具有不同分隔符的数据文本文件

  •  2
  • Liris  · 技术社区  · 6 年前

    我有一个文件,其中字段用“:”分隔,子字段用“;”分隔,子字段中的项目用“,”分隔。

    我想读巨蟒。过了一段时间,我可能会一行一行地读,然后把所有的东西都分开,但我相信已经有了这样的东西?

    文件行:

       0 :   16,  250 :  1 :  0.053 :RIG : DIS :  1 :   48, 220;  2 :   42, 241;  2 :   43, 251;  3 :   25, 266;  1 :   36, 287;  2 
    

    我真的尝试过:

    Dat = np.genfromtxt(path, delimiter= ':', dtype = None, skip_header = 4,  skip_footer = 5, encoding = None)
    

    因为我不明白的原因,它只会把文件的第一列还给我。但是,如果我改为 delimiter= ',' .

    这给了我7个字段,实际上我可以拆分自己。

    然后: 1)如何读取该文件? 2)使用np.genfromtxt,为什么只使用“:”作为分隔符获取第一列?

    2 回复  |  直到 6 年前
        1
  •  4
  •   dl.meteo    6 年前

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

        2
  •  0
  •   hpaulj    6 年前
    In [280]: txt=['   0 :   16,  250 :  1 :  0.053 :RIG : DIS :  1 :   48, 220;  2 
         ...: :   42, 241;  2 :   43, 251;  3 :   25, 266;  1 :   36, 287;  2 '
         ...: ]
    
    In [282]: np.genfromtxt(txt,delimiter=':',dtype=None, encoding=None)
    Out[282]: 
    array((0, '   16,  250 ', 1, 0.053, 'RIG ', ' DIS ', 1, '   48, 220;  2 ', '   42, 241;  2 ', '   43, 251;  3 ', '   25, 266;  1 ', '   36, 287;  2'),
          dtype=[('f0', '<i8'), ('f1', '<U12'), ('f2', '<i8'), ('f3', '<f8'), ('f4', '<U4'), ('f5', '<U5'), ('f6', '<i8'), ('f7', '<U15'), ('f8', '<U15'), ('f9', '<U15'), ('f10', '<U15'), ('f11', '<U14')])
    

    dtype=None

    ,

    In [283]: np.genfromtxt(txt,delimiter=',',dtype=None, encoding=None)
    Out[283]: 
    array(['0 :   16', '  250 :  1 :  0.053 :RIG : DIS :  1 :   48',
           ' 220;  2 :   42', ' 241;  2 :   43', ' 251;  3 :   25',
           ' 266;  1 :   36', ' 287;  2'], dtype='<U42')
    

    genfromtxt

    In [285]: def foo(astr):
         ...:     return astr.replace(':',',').replace(';',',')
         ...: 
         ...: 
    In [286]: np.genfromtxt([foo(a) for a in txt],delimiter=',',dtype=None, encoding
         ...: =None)
    Out[286]: 
    array((0, 16, 250, 1, 0.053, 'RIG ', ' DIS ', 1, 48, 220, 2, 42, 241, 2, 43, 251, 3, 25, 266, 1, 36, 287, 2),
          dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<i8'), ('f3', '<i8'), ('f4', '<f8'), ('f5', '<U4'), ('f6', '<U5'), ('f7', '<i8'), ('f8', '<i8'), ('f9', '<i8'), ('f10', '<i8'), ('f11', '<i8'), ('f12', '<i8'), ('f13', '<i8'), ('f14', '<i8'), ('f15', '<i8'), ('f16', '<i8'), ('f17', '<i8'), ('f18', '<i8'), ('f19', '<i8'), ('f20', '<i8'), ('f21', '<i8'), ('f22', '<i8')])
    

    dtype

    In [298]: dt = np.dtype([('f0','i'),('f1','i',2),('f2','i'),('f3','i'),('f4','U3
         ...: ')])
    In [299]: np.genfromtxt([foo(a) for a in txt],delimiter=',',dtype=dt, encoding=N
         ...: one,usecols=range(6))
    Out[299]: 
    array((0, [ 16, 250], 1, 0, 'RIG'),
          dtype=[('f0', '<i4'), ('f1', '<i4', (2,)), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<U3')])
    

    '16,250'


    pandas csv engine=python