2010-12-03 2 views
3

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

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", 

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

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

ответ

3

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 
+0

Все эти ответы были замечательными, но вы получили чек на чистое количество исправлений и исправлений вашего первоначального ответа. Благодаря! – Stedy 2010-12-03 05:37:40

1

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

for line in open('yourfile').read().split('\n'): 
    for token in line.split('\t'): 
     print token[:3] if token else 'N\A' 
4

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

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

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

0

Я не писал питона в то время. Но я, вероятно, напишу его как таковой.

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

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

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