【问题标题】:Import a txt file to an 2D array and remove special characters in each line将 txt 文件导入二维数组并删除每行中的特殊字符
【发布时间】:2022-01-15 08:24:45
【问题描述】:

我尝试了很多方法来导入这种格式的文本文件:

标题

标题

标题

[DD/MM/YY - HH:MM:SS:MS] +00975 +026.98 -0000.6 -0000.5 N2

[DD/MM/YY - HH:MM:SS:MS] +00975 +026.98 -0000.6 -0000.5 N2

[DD/MM/YY - HH:MM:SS:MS] +00974 +026.98 -0000.6 -0000.5 N2 ...

目标是创建一个二维数组,其中包含一行中的每个值作为单独的元素,行排列为行。 到目前为止,我只设法使用 numpy.genfromtxt 将一整行作为数组中的一个元素:

data = numpy.genfromtxt("test.txt", skip_header=3, delimiter=" ")

非常感谢任何帮助!

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    1- 对于简单的 Pythonic 方式,您可以执行以下操作:

        # Start reading the entire file using readlines() method.
        with open('test.txt') as my_file:
            my_array = my_file.readlines()
     
        # After that skip empty lines iterating over my_rray:
        my_array = [l.split(" ") for l in my_array if l != "\n"]
    
        # Finally create a numpy array from your python list:
        data = np.asarray(my_array)
    

    2- 另一方面,您可以使用genfromtxt 方法获得更优雅的解决方案,并在一行中解决:

        data = numpy.genfromtxt('test.txt', dtype=str, delimiter=" ")
    

    注意:

    • 我告诉 numpy 将值视为字符串
    • Numpy 自动过滤文件中的空行

    更多关于 genfromtxt 的信息here

    前两行的结果应类似于以下内容:

    array([['[DD/MM/YY', '-', 'HH:MM:SS:MS]', '+00975', '+026.98', '-0000.6',
            '-0000.5', 'N2\n'],
           ['[DD/MM/YY', '-', 'HH:MM:SS:MS]', '+00975', '+026.98', '-0000.6',
            '-0000.5', 'N2\n']], dtype='<U12')
    

    我希望我已经很好地理解了您想要做什么,并且我的回答会很有用!

    【讨论】:

    • 您好埃米利亚诺,感谢您的回答!不幸的是,我仍然有每行作为单个元素导入的问题(值之间没有逗号分隔)
    • array([['[08/10/21 - 14:43:45:921] +00975 +026.98 -0000.6 -0000.5 N2 '], ['[08/10/21 - 14 :43:45:923] +00975 +026.98 -0000.6 -0000.5 N2 '], ['[08/10/21 - 14:43:45:925] +00974 +026.98 -0000.6 -0000.5 N2 '], .. ., ['[08/10/21 - 16:00:05:435] +00975 +026.78 +0005.1 +0004.8 N2 '], ['[08/10/21 - 16:00:05:482] +00975 +026.78 +0005.0 +0004.8 N2 '], ['[08/10/21 - 16:00:05:515] +00975 +026.78 +0005.1 +0004.8 N2 ']], dtype='
    • 好吧,我明白了!我添加了一个额外的步骤,在纯 python 方法 (l.split(" ")) 上用 " " 分割每一行,这应该可以完成工作!此外,第二种方法应该可以按您的预期工作!请注意,在第一个中,您可以更灵活地更改导入行的方式,以防您对 numpy 不太熟悉
    • 还有一个问题:有些行包含的元素比大多数行都多。因此,我收到此错误消息:“不推荐从不规则的嵌套序列(它是列表或元组的列表或元组或具有不同长度或形状的 ndarray)创建一个 ndarray。如果你打算这样做,你创建 ndarray 时必须指定 'dtype=object'。”有没有办法跳过行?此外,每一行都被格式化为一个列表,我得到这个输出: array([list(['[08/10/21', '-', '14:43:45:921]', '+00975', '+026.98', '-0000.6', '-0000.5', '', '', '', '', 'N2', '\n']), 以此类推 "dtype=object"
    猜你喜欢
    • 2015-01-28
    • 1970-01-01
    • 2020-01-12
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多