Python String Manipulation - PullRequest
       15

Python String Manipulation

0 голосов
/ 30 января 2011

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

Time,Voltage,Peak
0.0,1.003911558621642,3
0.00390625,1.0327467181982755,0
0.0078125,0.9904463156237306,0
0.01171875,0.6867661682528724,0
0.015625,0.6236803073669519,0
0.01953125,0.2934711210503298,0
0.0234375,0.06148933838536881,0
0.02734375,0.07053968550834916,0
0.03125,-0.09041720958299812,0
0.03515625,-0.28273374252040306,0
0.0390625,-0.29775398016603216,0

Ответы [ 5 ]

8 голосов
/ 30 января 2011

Это звучит как работа для модуля CSV

import csv
with open("input.txt", "rb") as f:
    reader = csv.reader(f)
    next(reader)
    for i in reader:
        print float(i[1])
4 голосов
/ 30 января 2011

Это пропустит первую строку и вернет список чисел из второго столбца:

def get_second_col_floats(file_name):
    with open(file_name) as f:
        f.next() # skip the first line
        return [float(line.split(',')[1]) for line in f]

Редактировать: Вы также можете проверить модуль Python CSV , если выв конечном итоге нужно делать более сложные вещи.Это часть стандартной библиотеки, поэтому она не добавляет больше зависимостей.

4 голосов
/ 30 января 2011
with open("input.txt") as f:
    for s in f:
        print(s.split(",")[1])
3 голосов
/ 30 января 2011

Будет возвращено напряжение в виде списка значений с плавающей запятой

voltage = [float(x.split(",")[1])
           for x in open("input.txt").readlines()[1:]]

Эта компактная форма использует преимущества многих возможностей Python

  1. open("input.txt").readlines() - это отдельное выражение, которое возвращает вам все содержимое файла в виде списка, где каждый элемент находится на одну строку из файла. Помещение всего файла в список является разумным способом обработки содержимого файла, за исключением случаев, когда размер файла огромен (несколько мегабайт), и лучше обрабатывать его явно построчно.

  2. x[1:] - это выражение Python «slice», которое дает список x возвращает новый идентичный список, однако первый элемент из x удален. В вашем случае он используется для удаления строки заголовка.

    Общая форма x[begin:end:step] и позволяет извлекать данные из списков многими полезными способами ... например, список всех элементов x с четным индексом равен просто x[::2], или список последних 10 элементов x равен x[-10:].

  3. x.split(",") возвращает содержимое строки x в виде массива подстрок путем вырезания на указанном разделителе ",". Таким образом, объединенное выражение x.split(",")[1] позволяет извлечь второе значение из строки файла.

  4. [expr(x) for x in L] называется выражением «понимание списка» и возвращает список результатов оценки expr(x) для каждого элемента, присутствующего в списке L.

Все они объединили эти функции, позволяя решить вашу проблему всего одной строкой кода, и хотя для небольших задач, подобных этой, это нормально, однако это не следует доводить до крайности (если вы не игра гольф ;-))

2 голосов
/ 30 января 2011

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

Данные из файла обрабатываются путем чтения их по одной строке за раз, а не всей сразу, что минимизирует использование памяти при построении списка независимо от размера файла. Было бы очень легко расширить это, чтобы обработать другие значения и сохранить их в списке, или в другом типе структуры данных, такой как словарь.

import csv
with open("data.txt", "rb") as csvfile:
    voltages = [float(row['Voltage']) for row in csv.DictReader(csvfile)]

print 'voltages:', voltages

Выход:

voltages: [1.003911558621642, 1.0327467181982755, 0.9904463156237306, 0.6867661682528724, 0.6236803073669519, 0.2934711210503298, 0.06148933838536881, 0.07053968550834916, -0.09041720958299812, -0.28273374252040306, -0.29775398016603216]
...