Как опустить нежелательные символы при разборе строки из файла в Python 3

Эта проблема: Мне предоставляется файл .dat с 3 столбцами из 100 данных (идентификационный номер, вес объекта, стоимость объекта), которые разделены некоторыми пробелами/вкладками (см. ниже). Для целей моего задания в классе по марковским моделям я просто переписал все эти данные в массив 3x100 для использования в своих симуляциях. Однако, если бы список был длиннее, я бы не смог выполнить этот шаг вручную, поэтому я хотел бы научиться правильно читать в каждой строке файла .dat так, чтобы каждое из значений данных помещалось в (100x3) 2-мерная матрица/список под названием «данные». Повторюсь, это нигде не связано с домашним заданием, я просто хочу понять, как лучше всего эффективно вводить такой гипотетически большой файл данных с помощью python 3.

Ниже приведены первые восемь строк входного файла .dat. Форматирование опубликовано иначе, чем оно выглядит при копировании в поле вопроса, но я не хочу редактировать его ради форматирования, если это имеет отношение к проблеме.

%%id     weight (metric tons)    value (1000 USD) 
1    45220           28312 
2    38764           22635 
3    24801           21689 
4    4507            22864 
5    57671           12037 
6    64263           15571 
7    59482           1618 

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

with open('Packing.dat') as f:
    for line in f:
        for i in range(len(line)):
            #functionThatMovesDownLineAndDistributesData(char)

Что я хотел бы узнать, как это сделать, так это анализировать каждую из строк данных, игнорировать все пробелы между данными и распределять три типа данных в 2-мерный массив, чтобы использовать его для последующей обработки.

  1. Как игнорировать все, что не является числом, когда я двигаюсь вниз по строке?
  2. Как мне настроить систему, которая знает, когда определенные данные были проанализированы и готовы к добавлению в 2-мерную матрицу? Значения не всегда одного размера, но они являются всегда разделены хотя бы одним пробелом/табуляцией.

Большое спасибо всем, кто готов предложить некоторую помощь!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

line = '1    45220           28312'
print(line.split())
#['1', '45220', '28312']
datas = []
with open('Packing.dat') as f:
    #Ignore the first line with column description
    next(f)
    #Iterate through lines in the file
    for line in f:
        data = []
        #Get all elements in each line in a list
        items = line.split()
        #Append these elements to a list
        for item in items:
            data.append(int(item))
        #Append the elements list to a bigger list
        datas.append(data)
print(datas)
#[[1, 45220, 28312], [2, 38764, 22635], [3, 24801, 21689], [4, 4507, 22864], [5, 57671, 12037], [6, 64263, 15571], [7, 59482, 1618]]

Большое спасибо! Но я не совсем понимаю, что происходит. Разбивает ли items = line.split() строку на каждый из ее отдельных символов? Когда к данным добавляются отдельные значения, где происходит различие между категориями? Читая этот код, я бы подумал, что вывод будет [[14522028312], [23876422635], ...].

mike 10.04.2019 04:11

Другие вопросы по теме