Чтение столбцов данных из файла, который добавляет или удаляет столбцы - PullRequest
0 голосов
/ 13 марта 2020

Я пытаюсь настроить мою 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)

Хотя это неэффективно, это работает для текущего файла, который я использую. Однако, если бы я изменил файл на другой с другими столбцами, это вызовет ошибку, что список выходит за пределы диапазона, или он не распечатает все данные в файле.

Возможно ли это способ чтения данных из файла независимо от количества столбцов?

1 Ответ

0 голосов
/ 13 марта 2020

Вместо того, чтобы иметь от col0 до col8 в качестве отдельных списков, вы можете иметь список списков, где cols = [[]]. У вас есть блок

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

, который является наивным подходом к работе с каждым элементом в valstrings. Еще один для l oop может быть добавлен в for line in DataFile: l oop, который вставляет каждое значение столбца в соответствующий массив.

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

Я не совсем уверен, как раздел с UserVals.append(col0) и др c. используется, но я бы попытался использовать заголовки столбцов в качестве ключей в словаре, чтобы вы могли ссылаться на каждый столбец, не зная, сколько их, и это должно сделать ваш код немного более читабельным.

Первый блок кода, безусловно, можно очистить, чтобы он выглядел так:

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 пустыми списками, прежде чем начать ссылаться на cols[i]

...