【问题标题】:Reading columns of data from a file that adds or removes columns从添加或删除列的文件中读取数据列
【发布时间】:2020-03-13 01:40:29
【问题描述】:

我正在尝试将我的 python 程序调整为“适应”具有或多或少数据列的文件。 我目前的方法是这样的:

file_name = 'C:/Users/gwong/Documents/ME 021/CylindricalRollerBearingData_01.txt'

answer = 'y'
col0 = []
col1 = []
col2 = []
col3 = []
col4 = []
col5 = []
col6 = []
col7 = []
col8 = []
with open(file_name, 'r') as DataFile:
    Title = DataFile.readline()
    header = DataFile.readline().split()
    units = DataFile.readline().split()
    for line in DataFile:
        valstrings = line.split()
        col0.append(float(valstrings[0]))
        col1.append(float(valstrings[1]))
        col2.append(float(valstrings[2]))
        col3.append(float(valstrings[3]))
        col4.append(float(valstrings[4]))
        col5.append(float(valstrings[5]))
        col6.append(float(valstrings[6]))
        col7.append(float(valstrings[7]))
        col8.append(valstrings[8] + valstrings[9])

数据文件如下所示:

SKF Bearing Data for Cylindrical roller bearings, single row (Metric)
Principal dimensions    Basic load ratings  Fatigue load limit  Speed ratings   Designation
d[mm]   D[mm]   B[mm]   C[kN]   C0[kN]  Pu[kN]  Ref speed[r/min]    Lim speed[r/min]    Designation bearing
15  35  11  12.5    10.2    1.22    22000   26000   NJ 202 ECP
15  35  11  12.5    10.2    1.22    22000   26000   NU 202 ECP
15  35  11  12.5    10.2    1.22    22000   34000   NU 202 ECPHA

这是使用文件中数据的代码的方式:

while (answer == 'y'):
    UserMins =[] 
    UserMaxs =[]
    ans = 'y'
    while (ans == 'y'):
        UserVals = []


        UserVals.append(col0)
        UserVals.append(col1)
        UserVals.append(col2)
        UserVals.append(col3)
        UserVals.append(col4)
        UserVals.append(col5)
        UserVals.append(col6)
        UserVals.append(col7)

虽然这效率低下,但这适用于我正在使用的当前文件。但是,如果我将文件更改为具有不同列的另一个文件,则会出现列表超出范围的错误,或者它不会打印文件中的所有数据。

有没有一种方法可以从文件中读取数据而不管列的数量?

【问题讨论】:

    标签: python file-read


    【解决方案1】:

    除了将col0col8 作为个人列表之外,您还可以拥有cols = [[]] 的列表列表。你有障碍

    for line in DataFile:
            valstrings = line.split()
            col0.append(float(valstrings[0]))
            col1.append(float(valstrings[1]))
            ...
    

    这是处理valstrings 中每个元素的幼稚方法。可以在 for line in DataFile: 循环中添加另一个 for 循环,将每个列值插入到相应的数组中。

    for line in DataFile:
            valstrings = line.split()
            for i,val in enumerate(valstrings):
                     cols[i].append(float(val))
    

    我不确定UserVals.append(col0) 等部分是如何使用的,但我会尝试将列标题用作字典中的键,这样您就可以在不知道有多少列的情况下引用每一列,并且它应该使您的代码更具可读性。

    第一个代码块当然可以清理成如下所示:

    file_name = 'C:/Users/gwong/Documents/ME 021/CylindricalRollerBearingData_01.txt'
    
    answer = 'y'
    # Note that cols starts as a list, and lists are appended to it later
    cols = []
    with open(file_name, 'r') as DataFile:
        Title = DataFile.readline()
        header = DataFile.readline().split()
        units = DataFile.readline().split()
        for line in DataFile:
            valstrings = line.split()
            # Edit made here to initialize cols list of lists
            for col in valstrings:
                cols.append([])
            for i,val in enumerate(valstrings):
                     cols[i].append(float(val))
    

    我认为底部可以更改为:

    while (answer == 'y'):
        UserMins =[] 
        UserMaxs =[]
        ans = 'y'
        while (ans == 'y'):
            UserVals = []
            for col in cols:
                UserVals.append(col)
    

    我还没有测试过,但是在开始引用 cols[i] 之前,您可能需要将 cols 数组的元素初始化为空列表

    【讨论】:

    • 当前返回:'IndexError: list index out of range'
    • 我编辑了代码来解决这个问题。在底部我提到您可能必须初始化 cols 数组中的每一列,所以我在创建 valstrings 之后添加了该循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2019-02-24
    • 1970-01-01
    • 2014-07-16
    • 2019-06-24
    • 2014-06-07
    相关资源
    最近更新 更多