Читать данные блока в Python? - PullRequest
1 голос
/ 17 июля 2009

У меня проблема с чтением файла данных:

///
* ABC Names
A-06,B-18,
* Data
 1.727e-01, 1.258e-01, 2.724e-01, 2.599e-01,-3.266e-01,-9.425e-02,-6.213e-02, 1.479e-01,
 1.219e-01, 1.174e-01, 2.213e-01, 2.875e-01,-2.306e-01,-3.900e-03,-5.269e-02, 7.420e-02,
 2.592e-01, 2.513e-01, 2.242e-01, 2.620e-01,-1.346e-01,-6.844e-02,-4.139e-02, 9.502e-02,
 1.981e-01, 1.937e-01, 2.336e-01, 1.617e-01,-4.240e-02, 2.285e-02, 1.878e-02, 1.064e-01,
 9.562e-02, 6.727e-02, 1.135e-01, 6.765e-02,-7.850e-02, 6.711e-02, 1.317e-02, 8.367e-02, 
* Starting position
     -.5000E+01
///

Код запускается на Python? Я пытался использовать функции readline(), readlines(), но безрезультатно.

Ответы [ 6 ]

2 голосов
/ 21 июля 2009

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

f = open("mdata.txt")

data_dict = {}
section = None
data_for_section = ""
for line in f:
    line = line.strip() #remove whitespace at start and end

    if section != None and (line[0] == "*" or line == "///"):
        # if we've just finished a section, put whatever we got into the data dict
        data_dict[section] = [bit for bit in data_for_section.split(",") if bit != ""]

    if line[0] == "*":
        # "*" denotes the start of a new section, probably, so remember the name
        section = line [2:]
        data_for_section = ""
        continue
    data_for_section += line

f.close()
#got the data, now for some output
print "loaded file. Found headings: %s"%(", ".join(data_dict.keys()))

for key in data_dict.keys():
    if len(data_dict[key])>5:
        print key, ": array of %i entries"%len(data_dict[key])
    else:
        print key, ": ", data_dict[key]

который выводит для вашего файла:

loaded file. Found headings: ABC Names, Data, Starting position
ABC Names :  ['A-06', 'B-18']
Data : array of 40 entries
Starting position :  ['-.5000E+01']

Конечно, вы, вероятно, захотите преобразовать список строк данных в числа с плавающей запятой в случае данных и начальной позиции:

startingPosition = float(data_dict["Starting position"][0])
data_list_of_floats = map(float, data_dict["Data"])

Но что касается имен ABC и того, как они сочетаются с остальной частью файла, нам понадобится дополнительная информация для этого.

1 голос
/ 17 июля 2009

Это должно работать для файлов с именами блоков «a», «b» и «c». Он создаст словарь с ключами в виде заголовков блоков, например:

{'a':['line1','line2'],'b':['line1'],'c':['line1','line2','line3']} 

код:

block_names = ['b','a','c']

for line in open('file.txt'):
    block_dict = {}  #dict to populate with lists of lines
    block = []  # dummy block in case there is data or lines before first block
    ck_nm = [blk_nm for blk_nm in block_names if line.startswith(blk_nm)]  #search block names for a match
    if ck_nm: # did we find a match?
        block_dict[ck_nm[0]] = block = []  # set current block
    else:
        block.append(line)  #..or line.split(',') ..however you want to parse the data
0 голосов
/ 17 августа 2009

Спасибо за ваш ответ. Тем не менее, я попытался начать с кода Маркуса, но потерпел неудачу, когда между этой строкой и этой строкой существуют пустые. Пример: /// "filename.txt" имеет: * ABC Names А-06, Б-18, * Данные 1.727e-01, 1.258e-01, 2.724e-01, 2.599e-01, -3.266e-01, -9.425e-02, -6.213e-02, 1.479e-01, 1.219e-01, 1.174e-01, 2.213e-01, 2.875e-01, -2.306e-01, -3.900e-03, -5.269e-02, 7.420e-02, 2.592e-01, 2.513e-01, 2.242e-01, 2.620e-01, -1.346e-01, -6.844e-02, -4.139e-02, 9.502e-02, 1.981e-01, 1.937e-01, 2.336e-01, 1.617e-01, -4.240e-02, 2.285e-02, 1.878e-02, 1.064e-01, 9.562e-02, 6.727e-02, 1.135e-01, 6.765e-02, -7.850e-02, 6.711e-02, 1.317e-02, 8.367e-02, * Начальная позиция -.5000E + 01

  • Общее количество кликов (изменено) 18

  • Время кликера (изменено) 448 +748 /// Ошибка, когда между «Начальная позиция» и «Общее количество кликов (изменено)» есть пустая строка. Мне нужны данные: 1.727e-01, 1.258e-01, 2.724e-01, 2.599e-01, -3.266e-01, -9.425e-02, -6.213e-02, 1.479e-01, 1.219e-01, 1.174e-01, 2.213e-01, 2.875e-01, -2.306e-01, -3.900e-03, -5.269e-02, 7.420e-02, 2.592e-01, 2.513e-01, 2.242e-01, 2.620e-01, -1.346e-01, -6.844e-02, -4.139e-02, 9.502e-02, 1.981e-01, 1.937e-01, 2.336e-01, 1.617e-01, -4.240e-02, 2.285e-02, 1.878e-02, 1.064e-01, 9.562e-02, 6.727e-02, 1.135e-01, 6.765e-02, -7.850e-02, 6.711e-02, 1.317e-02, 8.367e-02, в блоке "* Данные" а иногда нужны данные
    448 +748 в блоке "* Время кликера (изменено)"

0 голосов
/ 20 июля 2009

Без какой-либо другой информации ...

data = [
1.727e-01, 1.258e-01, 2.724e-01, 2.599e-01,-3.266e-01,-9.425e-02,-6.213e-02, 1.479e-01,
1.219e-01, 1.174e-01, 2.213e-01, 2.875e-01,-2.306e-01,-3.900e-03,-5.269e-02, 7.420e-02,
2.592e-01, 2.513e-01, 2.242e-01, 2.620e-01,-1.346e-01,-6.844e-02,-4.139e-02, 9.502e-02,
1.981e-01, 1.937e-01, 2.336e-01, 1.617e-01,-4.240e-02, 2.285e-02, 1.878e-02, 1.064e-01,
9.562e-02, 6.727e-02, 1.135e-01, 6.765e-02,-7.850e-02, 6.711e-02, 1.317e-02, 8.367e-02,
]
0 голосов
/ 17 июля 2009

Предполагая, что вы хотите получить блок из * Данные в * Начальная позиция,

f=0
for line in open("file"):
    line=line.strip()
    if "Starting" in line:
        f=0
    if "Data" in line:
        f=1
        continue
    if f:
        print line

Идея состоит в том, чтобы установить флаг. если * Данные нажаты, установите флаг. печать всех строк, если установлен флаг. Если нажата * Starting, выключите флаг.

0 голосов
/ 17 июля 2009

Предположим, файл называется "abc.txt" и находится в текущем каталоге; тогда следующий скрипт Python:

f = open("abc.txt")
all_lines = f.readlines()

будет считывать все строки в список строк all_lines, каждая с окончанием \n и все.

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

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