【问题标题】:importing function parameters numpy导入函数参数numpy
【发布时间】:2019-06-30 09:56:39
【问题描述】:

我正在尝试导入一个文本文件 (.xyz),这个文件看起来像这样:

1 9 1 6 "Thu Feb 13 13:12:30 2014     "
0 0 0 0 0 0
38 38 915 915
"CJE                                                                              "
"2                                      "
"110321-025-01D-1ST                    
0 0 1 .1 73.7972 17 50
1 0 7 1 60 0 0 0 0
0 "                           "
1 0
#
38 38 No Data
39 38 No Data
40 38 No Data
41 38 3
42 38 No Data
43 38 4
44 38 4
45 38 5
#

文本文件有一个标题(前 11 行),其中包含一些数值,如下所示,数据也分为三列,其中一列有数值,还有写的字符:“No数据”。我还想将数值 0 的“无数据”更改。

我可以跳过标题,但主要问题是我有它告诉代码有三列,并且“没有数据”意味着 0。 这是我到现在用的,

import numpy as np
data = np.genfromtxt('180228_Test V2-4_0grad.xyz',
                 skip_header=11,
                 skip_footer=1,
                 names=True,

                 dtype=None,
                 delimiter=' ')
print(data)

【问题讨论】:

    标签: python numpy genfromtxt


    【解决方案1】:

    您可以添加invalid_raise = False 以跳过违规行或添加usecols=np.arange(0, 3),但我会采用以下方法:

    list.txt:

    1 9 1 6 "Thu Feb 13 13:12:30 2014     "
    0 0 0 0 0 0
    38 38 915 915
    "CJE                                                                              "
    "2                                      "
    "110321-025-01D-1ST                    
    0 0 1 .1 73.7972 17 50
    1 0 7 1 60 0 0 0 0
    0 "                           "
    1 0
    #
    38 38 No Data
    39 38 No Data
    40 38 No Data
    41 38 3
    42 38 No Data
    43 38 4
    44 38 4
    45 38 5
    

    然后:

    logFile = "list.txt"
    
    # opening the file
    with open(logFile) as f:
    
        #reading the lines after slicing it i.e. 11
        content = f.readlines()[11:]
    
    # you may also want to remove empty lines
    content = [l.strip() for l in content if l.strip()]
    
    # for each line in content
    for line in content:
    
         # if the line has No Data in it
         if line.find("No Data"):
    
             # Replacing the No Data with 0 using replace() method
             line = line.replace("No Data", "0")
         print(line)
    

    输出:

    38 38 0
    39 38 0
    40 38 0
    41 38 3
    42 38 0
    43 38 4
    44 38 4
    45 38 5
    

    编辑:

    将它们添加到 3 列矩阵中:

    _list = []
    # for each line in content
    for line in content:
    
         # if the line has No Data in it
         if line.find("No Data"):
    
             # Replacing the No Data with 0 using replace() method
             line = line.replace("No Data", "0")
         # print(line)
         # list comprehension for splitting on the basis of space and appending to the list
         _list.append([e for e in line.split(' ') if e])
    
    print(_list)
    

    输出:

    [['38', '38', '0'], ['39', '38', '0'], ['40', '38', '0'], ['41', '38', '3'],
     ['42', '38', '0'], ['43', '38', '4'], ['44', '38', '4'], ['45', '38', '5']]
    

    编辑 2:

    要删除文件中的最后一行,您可以使用切片 content[:-1]::

    logFile = "list.txt"
    
    # opening the file
    with open(logFile) as f:
    
        #reading the lines after slicing it i.e. 11
        content = f.readlines()[11:]
    
    _list = []
    # for each line in content
    for line in content[:-1]:
    
         # if the line has No Data in it
         if line.find("No Data"):
             # Replacing the No Data with 0 using replace() method
             line = line.replace("No Data", "0")
         # list comprehension for splitting on the basis of space and appending to the list
         _list.append([e for e in line.strip().split(' ') if e])
    
    
    print(_list)
    

    输出:

    [['38', '38', '0'], ['39', '38', '0'], ['40', '38', '0'], ['41', '38', '3'],
     ['42', '38', '0'], ['43', '38', '4'], ['44', '38', '4'], ['45', '38', '5']]
    

    【讨论】:

    • 非常感谢,我是python的新手,所以你能解释一下鳕鱼的每一部分是做什么的吗?而且,我怎样才能将这些数据存储在 3 列矩阵中?
    • @Lpng 当然,我会在代码中添加更多的 cmets。
    • @Lpng 如果有帮助,您可以通过单击答案旁边的勾号来接受此答案,谢谢!
    • 对不起,我又问了一次,因为我不知道你现在是否有空,所以我遇到了两个问题,proam 说 '_list' 没有定义,而且在结尾文件中有一行只有这个符号#,我不知道如何摆脱它
    • @Lpng 你应该回到这里并要求它,我已经在我的第二次编辑中添加了这些。 PS。如果一切正常,您可以接受答案,干杯!
    【解决方案2】:

    这是一种不同的方法。首先,读取所有行并将每一行放入列表的一个元素中。这都是由 readlines() 完成的。然后,忽略前 11 个句子。然后,对于行列表中的每一行,将“No Data”替换为 0。然后,将所有行粘合在一起形成一个字符串。由这个字符串组成一个 numpy 数组,并重新调整为正确的格式

    import numpy as np
    
    #Open the file and read the lines as a list of lines
    with open('/home/we4sea/PycharmProjects/Noonreport-processing/GUI/test.txt','r') as f:
        file = f.readlines()
    
    #Skip the first 11 lines
    file = file[11:]
    
    #Create new list where the replaced lines are placed
    replaced = []
    
    #Replace "No Data" with 0
    for line in file:
        replaced.append(line.replace('No Data', '0'))
    
    #Concatenate list to a single string
    file = ''.join(replaced)
    
    #Create numpy array from it and reshape to the correct format
    data = np.fromstring(file, sep=' ').reshape(-1,3)
    
    #Print the data
    print(data)
    

    输出:

    [[38. 38.  0.]
     [39. 38.  0.]
     [40. 38.  0.]
     [41. 38.  3.]
     [42. 38.  0.]
     [43. 38.  4.]
     [44. 38.  4.]
     [45. 38.  5.]]
    

    【讨论】:

    • 嗨,谢谢你的回答,我只有一个问题,最后一行是一个#,抱歉我之前没有输入问题,但现在它是。并且我需要在重塑之前摆脱那一行,否则它不起作用,我该怎么做?
    • 删除前 11 行时,您也可以使用类似的操作删除最后一行。在跳过前 11 行部分后添加:file = file[:-1]
    猜你喜欢
    • 2012-08-01
    • 2019-04-16
    • 1970-01-01
    • 2018-04-25
    • 2017-03-27
    • 2013-12-21
    • 1970-01-01
    • 2019-12-11
    • 2018-09-06
    相关资源
    最近更新 更多