2015-11-16 3 views
0

Мне нужен совет и предложение о том, как заменить запятые точками и отдельными номерами. Я хорошо объясняю.Как отделить запятые цифры от txt-файла?

это то, что я получил из файла: 12,1899995803833,0,135000005364418,0,0582966990768909 13,0600004196167,0,141000002622604,0,098975196480751

Моя проблема заключается в том, что в первую очередь я необходимо заменить НЕКОТОРЫЕ запятые точкой, в частности мне нужно заменить первую, третью, запятую запятую и оставить вторую и четвертую. Тогда мне нужно уменьшить количество сигнификативных чисел и поставить вкладку, следующим образом:

12,18, 0,13, 0,05 13,06, 0,14, 0,09

Как вы можете видеть два Raws отличаются по длине, так Я не могу изменить элемент в определенном месте. Я думал о создании отдельной строки для каждого сырья, а затем, посмотрев на среднюю позицию, назначил диапазон. Например, первая запятая всегда является вторым, третьим или четвертым символом. Поэтому я могу сказать: «В этом диапазоне позиций есть, измените это». Но это не дело других запятая, потому что разница может быть очень большой, например

29,3099994659424,0,521000027656555,2,40029883384705 29,75,0,531000018119812,2,46150183677673

(и это то, что я хочу иметь: 29,30, 0,52, 2,40 29,75, 0,53, 2,46)

Я думал, чтобы запустить программу более чем 1 раз, поэтому сначала я заменить первую запятую и устранить все числа после второй цифры, то я делаю то же самое для других 2 столбцов, но кажется очень длинным (у меня много файлов txt). Другими способами могут быть: - присвоение значения true/false каждой запятой, а затем итерация whit a для цикла - разделить все число в списке, а затем взять числа на позиции 1-3-5, называя их int, те, которые включены 2-4-6, называя их dec и используя функцию записи текста, записывать напрямую int, dec

Могу ли я использовать регулярное выражение? Знаете ли вы более элегантный способ двух, над которыми я работаю? Кроме того, можете ли вы набросать, как настроить программу? Несколько лет назад я учился в программировании в Jython в университете, но я не очень много помню. Спасибо всем!

ответ

1

Может быть, есть более элегантный способ, но я попытался зацикливание над «строк», то разделив каждую строку на запятые, то имеем дело с частями в парах:

text = """12,1899995803833,0,135000005364418,0,0582966990768909 
      13,0600004196167,0,141000002622604,0,098975196480751 
      29,3099994659424,0,521000027656555,2,40029883384705 
      29,75,0,531000018119812,2,46150183677673""" 

# First make the floats as a list of lists. 
out = [] 
for row in text.split(): 
    items = row.split(',') 
    ints, decs = items[::2], items[1::2] 
    outrow = [] 
    for i, d in zip(ints, decs): 
     outrow.append(float('{0}.{1}'.format(i, d))) 
    out.append(outrow) 

# Now we have a list of lists. Format them as text. 
result = '{0:>8s}{1:>8s}{2:>8s}\n'.format('A', 'B', 'C') 
for row in out: 
    result += '{0:8.2f}{1:8.2f}{2:8.2f}\n'.format(*row) 

print(result) 

В Python str.format() использует the formatting 'minilanguage'. Вы можете делать с ним всевозможные вещи.

Это дает:

A  B  C 
12.19 0.14 0.06 
13.06 0.14 0.10 
29.31 0.52 2.40 
29.75 0.53 2.46 

Вы также можете использовать out непосредственно как массив поплавки, например, в NumPy.

+0

Спасибо очень много, очень точный! Могу ли я спросить вас, как импортировать все тесты из txt-файла? Я знаю, как это происходит в Jython, и я думал, что это то же самое в Python, но, возможно, есть небольшая разница в функциях вызова. – matthewnln

+0

Если вы нацелены на массив NumPy, и я рекомендую это сделать, тогда это легко. Предполагая, что вы начинаете с файла 'myfile.txt.', содержащего текст, мой пример заканчивается на:' numpy.loadtxt ('myfile.txt', skiprows = 1) '. – kwinkunks

0

Используйте re из стандартной библиотеки, чтобы получить чередующуюся замену ',' на '.' на каждой линии.

import re 
rows = [[float(num) for num in re.sub(r'(\d+),(\d+)',r'\1.\2',row).split(',')] for row in text.split()] 

В качестве примера:

text = """12,1899995803833,0,135000005364418,0,0582966990768909 
      13,0600004196167,0,141000002622604,0,098975196480751 
      29,3099994659424,0,521000027656555,2,40029883384705 
      29,75,0,531000018119812,2,46150183677673""" 

будет производить следующее, используя список понимание:

rows 
>>>[[12.1899995803833, 0.135000005364418, 0.0582966990768909], 
[13.0600004196167, 0.141000002622604, 0.098975196480751], 
[29.3099994659424, 0.521000027656555, 2.40029883384705], 
[29.75, 0.531000018119812, 2.46150183677673]] 

Я не иметь ничего, чтобы добавить на форматирование сверх того, что @kwinkunks предусмотрено. Основываясь на своем ответе вы можете преобразовать rows список списков в печати строки, выполнив следующие действия:

printable=''.join(['{0:8.2f}{1:8.2f}{2:8.2f}\n'.format(*row) for row in rows]) 
+0

Привет, Хаммель, большое спасибо за ваш ответ, я попробую также этот метод. ; D – matthewnln

Смежные вопросы