Нарезать определенные символы в CSV, используя Python - PullRequest
3 голосов
/ 03 декабря 2010

У меня есть данные в формате с разделителями табуляции, который выглядит следующим образом:

0/0:23:-1.03,-7.94,-83.75:69.15    0/1:34:-1.01,-11.24,-127.51:99.00    0/0:74:-1.02,-23.28,-301.81:99.00

Меня интересуют только первые 3 символа каждой записи (т. Е. 0/0 и 0/1).Я подумал, что лучший способ сделать это - использовать match и genfromtxt в numpy.Этот пример, насколько я получил:

import re
csvfile = 'home/python/batch1.hg19.table'
from numpy import genfromtxt
data = genfromtxt(csvfile, delimiter="\t", dtype=None)
for i in data[1]:
    m = re.match('[0-9]/[0-9]', i)
        if m:
        print m.group(0),
        else:
        print "NA",

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

Должен ли я сделать это функцией и применить ее к каждой строке отдельно или есть более питонский способ сделать это?

Ответы [ 4 ]

4 голосов
/ 03 декабря 2010

Если вы действительно не хотите использовать NumPy, попробуйте следующее:

file = open('home/python/batch1.hg19.table')
for line in file:
    for cell in line.split('\t'):
        print(cell[:3])

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

3 голосов
/ 03 декабря 2010

Numpy отлично подходит, когда вы хотите загрузить массив чисел. Формат, который у вас есть, слишком сложен для распознавания numpy, поэтому вы просто получаете массив строк. Это на самом деле не играет на пользу NumPy.

Вот простой способ сделать это без numpy:

result=[]
with open(csvfile,'r') as f:
    for line in f:
        row=[]
        for text in line.split('\t'):
            match=re.search('([0-9]/[0-9])',text)
            if match:
                row.append(match.group(1))
            else:
                row.append("NA")
        result.append(row)
print(result)

выходы

# [['0/0', '0/1', '0/0'], ['NA', '0/1', '0/0']]

по этим данным:

0/0:23:-1.03,-7.94,-83.75:69.15 0/1:34:-1.01,-11.24,-127.51:99.00   0/0:74:-1.02,-23.28,-301.81:99.00
---:23:-1.03,-7.94,-83.75:69.15 0/1:34:-1.01,-11.24,-127.51:99.00   0/0:74:-1.02,-23.28,-301.81:99.00
1 голос
/ 03 декабря 2010

Довольно просто разобрать весь файл без регулярных выражений:

for line in open('yourfile').read().split('\n'):
    for token in line.split('\t'):
        print token[:3] if token else 'N\A'
0 голосов
/ 03 декабря 2010

Я давно не писал Python.Но я бы, наверное, написал так:

file = open("home/python/batch1.hg19.table")
for line in file:
    columns = line.split("\t")
    for column in columns:
        print column[:3]
file.close()

Конечно, если вам нужно проверить первые три символа, вам все равно понадобится регулярное выражение.

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