читать указанный столбец из файла, который содержит несколько наборов данных, используя Python

1

Я пытаюсь загрузить несколько столбцов данных из файла.txt с помощью python.

Мой файл содержит несколько наборов данных, и каждый набор имеет заголовок.

Я хочу выбрать набор, а затем выбрать из него 2 столбца. Я использую genfromtxt для чтения файла.txt, но он читает заголовок набора в виде столбца, поэтому он дает мне такую ошибку:

Строка № 2 (получилось 4 столбца вместо 1)

это пример моего txt файла, где TC_14TeV_NLO и TC_13TeV_LO являются заголовками, и я хочу взять первые 2 столбца каждого набора:

TC_14TeV_NLO 
1000 1.51100e+01 6.2e-03 4.1e-02%
2000 7.36556e-01 4.4e-04 5.9e-02%
3000 7.85092e-02 5.1e-05 6.5e-02%
4000 1.17810e-02 7.4e-06 6.3e-02%
5000 2.39873e-03 1.3e-06 5.2e-02%
6000 7.18132e-04 2.7e-07 3.7e-02%
7000 3.10281e-04 8.1e-08 2.6e-02%
8000 1.67493e-04 3.3e-08 1.9e-02%
9000 1.01369e-04 2.2e-08 2.2e-02%
10000 6.54776e-05 1.6e-08 2.4e-02%

TC_13TeV_LO
1000 1.04906e+01 1.7e-03 1.7e-02%
2000 4.53170e-01 8.1e-05 1.8e-02%
3000 4.25722e-02 7.9e-06 1.9e-02%
4000 5.80036e-03 1.1e-06 1.9e-02%
5000 1.17278e-03 2.1e-07 1.8e-02%
6000 3.82330e-04 6.1e-08 1.6e-02%
7000 1.78036e-04 2.7e-08 1.5e-02%
8000 9.91945e-05 1.9e-08 1.9e-02%
9000 6.05766e-05 1.6e-08 2.6e-02%
10000 3.92631e-05 1.2e-08 3.0e-02%
  • 0
    Почему бы вам не поместить каждый набор в другой файл? Я полагаю, что так будет проще.
  • 0
    Действительно, но я хотел бы знать, как бороться с таким файлом.
Теги:
numpy
genfromtxt

2 ответа

0
Лучший ответ

Сначала определите функцию для разбиения файла на разделы. Это генератор, который создает последовательность списков строк:

def split_sections(infile):
    """Generate a sequence of lists of lines from infile delimited by blank lines.
    """
    section = []
    for line in infile:
        if not line.strip():
            if section:
                yield section
                section = []
        else:
            section.append(line)
    if section: # last section may not have blank line after it
        yield section

Тогда ваша фактическая задача довольно проста:

with open(path) as infile:
    for lines in split_sections(infile):
        heading = lines[0].rstrip()
        data = np.genfromtxt(lines[1:], usecols=[0,1])
        print(heading)
        print(data)
  • 0
    спасибо за твой ответ Джон Я попробовал ваш код, но у меня все еще та же ошибка: ValueError: Обнаружены некоторые ошибки! Строка № 1 (получено 1 столбец вместо 2) Строка № 14 (получено 1 столбец вместо 2) Еще одна мысль - у меня разные заголовки (TC, SSM, NU, ...), поэтому я должен сделать несколько с open () как infile?
  • 0
    @Moe: я полностью переработал свой ответ, чтобы он был более общим и рассматривал дела, о которых вы спрашивали. Я также проверил это на вашем оригинальном примере текста.
Показать ещё 1 комментарий
1

Для вашего файла примера вы можете сделать это:

import pandas as pd

#read in first set of data, start from the beginning, read 10 lines
df1=pd.read_csv('exfile.txt', sep=" ",skiprows=None,nrows=10)

#read in the second set of data, do not start at the beginning of file but skip 11 rows, read the next 10 lines
df2=pd.read_csv('exfile.txt', sep=" ",skiprows=11,nrows=10)

#choose any two cols, for example:
print(df1['TC'])
print(df2['13TeV'])

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

  • 0
    (также подходящий заголовок для каждого из ваших столбцов улучшит ваш файл примера, в заголовке отсутствует имя последнего столбца)
  • 0
    спасибо за ответ Pal. Смысл в том, что у меня есть большое количество наборов, поэтому подсчет будет слишком большим. Я думал о том, как позволить коду распознавать каждый набор по его названию. названия не (TC 13TeV LO), но (TC_13TeV_LO). Так что это не заголовок для столбца, это для всего набора.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню