Чтение чисел из списка из текстового файла, но только до запятой - PullRequest
0 голосов
/ 26 сентября 2018

Это данные лабораторного эксперимента (около 717 строк данных).Вместо того, чтобы пытаться превзойти его, я хочу импортировать и отобразить его на Python или Matlab.Кстати, я новичок ... и я студент!

""
"Test Methdo","exp-l Tensile with Extensometer.msm"
"Sample I.D.","Sample108.mss"
"Speciment Number","1"

"Load (lbf)","Time (s)","Crosshead (in)","Extensometer (in)"

62.638,0.900,0.000,0.00008
122.998,1.700,0.001,0.00012

больше чисел: см. Снимок экрана с дополнительными данными из моего файла

Я просто не могу понять, как читать строку до запятой.В частности, мне нужны числа загрузки для одного из моих массивов / списков, поэтому, например, в первой строке мне нужно только 62,638 (это будет первое число в моем первом индексе в моем списке / массиве).

Как я могу получить массив / список этого, что-то, что повторяет / читает список и игнорирует строки?

Спасибо!

ПРИМЕЧАНИЕ: я использую ноутбуки Anaconda + Jupyter для Python & Matlab (школапрограммное обеспечение).

РЕДАКТИРОВАТЬ: Хорошо, поэтому я пришел домой сегодня и снова работал над этим.Раньше я не имел дело с CSV-файлами, но после некоторых поисков я смог немного научиться читать мой файл.

import csv
from itertools import islice

with open('Blue_bar_GroupD.txt','r') as BB:
    BB_csv = csv.reader(BB)
    x = 0
    BB_lb = []
    while x < 7: #to skip the string data
        next(BB_csv)
        x+=1
    for row in islice(BB_csv,0,758):
        print(row[0]) #testing if I can read row data

Хорошо, вот где я застрял.Я хочу сделать arraw / list, который имеет 0-е значение индекса каждой строки.Извините, если я ненормальный нуб!

Еще раз спасибо!

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018

Это очень просто в Matlab, всего 2 строки:

data = dlmread('data.csv', ',', 6,0);
column1 = data(:,1);

Где 6 и 0 следует заменить желаемым смещением строки и столбца.Таким образом, в этом случае данные начинаются со строки 7, и вам нужны все столбцы, а затем просто скопируйте данные из столбца 1. в другой вектор.

В качестве еще одного примечания попробуйте ввести doc dlmread в matlab - это приведет кна страницу справки для dlmread.Это действительно полезно, когда вы ищете функции Matlab, так как у него есть другие предложения для похожих функций внизу.

0 голосов
/ 26 сентября 2018

Вы можете пропустить все строки до первой строки данных, а затем проанализировать данные в списке для дальнейшего использования - более 700 строк могут быть легко обработаны в памяти.

Для этого вам необходимо:

  • прочитать файл построчно
    • запомнить последнюю непустую строку перед числом / запятой / точкой (== заголовок)
    • проверьте, является ли строка только цифрой / запятой / точкой, иначе увеличьте счетчик пропусков (== данные)
  • ищите 0
  • пропустить достаточно строк, чтобы добраться до заголовка или данных
  • прочитать остальные в структуру данных

Создать тестовый файл:

text = """
""
"Test Methdo","exp-l Tensile with Extensometer.msm"
"Sample I.D.","Sample108.mss"
"Speciment Number","1"

"Load (lbf)","Time (s)","Crosshead (in)","Extensometer (in)"

62.638,0.900,0.000,0.00008
122.998,1.700,0.001,0.00012
""" 
with open ("t.txt","w") as w:
    w.write(text)

Некоторые помощники илогика пропуска / чтения:

import re
import csv

def convert_row(row):
    """Convert one row of data into a list of mixed ints and others.
    Int is the preferred data type, else string is used - no other tried."""
    d = []
    for v in row:
        try:
            # convert to int && add
            d.append(float(v))
        except: 
            # not an int, append as is
            d.append(v)
    return d

def count_to_first_data(fh):
    """Count lines in fh not consisting of numbers, dots and commas.
    Sideeffect: will reset position in fh to 0."""
    skiplines = 0
    header_line = 0
    fh.seek(0)
    for line in fh:
        if re.match(r"^[\d.,]+$",line):
            fh.seek(0)
            return skiplines, header_line
        else:
            if line.strip():
                header_line = skiplines
            skiplines += 1
    raise ValueError("File does not contain pure number rows!")

Использование помощников / преобразование данных:

data = []
skiplines = 0
with open("t.txt","r") as csvfile:
    skip_to_data, skip_to_header = count_to_first_data(csvfile)

    for _ in range(skip_to_header): # skip_to_data if you do not want the headers
        next(csvfile)
    reader = csv.reader(csvfile, delimiter=',',quotechar='"')
    for row in reader:
        row_data = convert_row(row) 
        if row_data:
            data.append(row_data)

print(data)

Вывод (переформатированный):

[['Load (lbf)', 'Time (s)', 'Crosshead (in)', 'Extensometer (in)'], 
 [62.638, 0.9, 0.0, 8e-05], 
 [122.998, 1.7, 0.001, 0.00012]]

Доку:


Теперь у вас есть «чистые» данные, которые вы можете использовать для дальнейшей обработки, включая ваши заголовки.

Для визуализации вы можете взглянуть на matplotlib

0 голосов
/ 26 сентября 2018

Я бы порекомендовал прочитать ваш файл с помощью python

data = []
with open('my_txt.txt', 'r') as fd:
    # Suppress header lines
    for i in range(6):
        fd.readline()
    # Read data lines up to the first column
    for line in fd:
        index = line.find(',')
        if index >= 0:
            data.append(float(line[0:index]))

приводит к списку, содержащему ваши данные первого столбца

>>> data
[62.638, 122.998]

Решение MATLAB менее приятное, так как у вас естьузнать количество строк данных в вашем файле (которое вам не нужно знать в решении Python)

n_header = 6
n_lines = 2    % Insert here 717 (as you mentioned)

M = csvread('my_txt.txt', n_header, 0, [n_header 0 n_header+n_lines-1 0])

приводит к:

>> M
M = 
    62.6380
    122.9980

Для ясности:Вы также можете использовать функцию MATLABs textscan, чтобы достичь желаемого, не зная количества строк, но, тем не менее, код Python будет лучшим выбором, на мой взгляд.

0 голосов
/ 26 сентября 2018

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

Предполагая, что ваше имя файла - name.txt, попробуйте:

f = open("name.txt", "r")
all_lines = f.readlines()
grid = []
for line in all_lines:
    if ('"' not in line) and (line != '\n'):
        grid.append(list(map(float, line.strip('\n').split(','))))
f.close()

Сетка будет содержать серию списков, содержащих вашу группу чисел с плавающей точкой.

Объяснение для шутки: в цикле «for» я искал двойные кавычки, чтобы исключить любую строку, поскольку все строки сочетаются междуцитаты.Другой для пропуска пустых строк.Исходя из ваших потребностей, вы можете использовать список сетка по своему усмотрению.Например, чтобы получить первое число в первой строке, выполните

grid[0][0]

, так как список python считает от 0 до n-1 для n элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...