2010-12-03 20 views
3

j'avoir des données dans l'onglet format délimité qui ressemble à:Trancher caractères spécifiques au format CSV en utilisant python

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 

Je ne suis intéressé par les 3 premiers caractères de chaque entrée (c.-à-et 0/1 0/0) . J'ai pensé que la meilleure façon de le faire serait d'utiliser match et le genfromtxt en numpy. Cet exemple est aussi loin que je l'ai obtenu:

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

Cela fonctionne pour la première ligne des données qui, mais je vais avoir du mal à comprendre comment le développer pour chaque ligne du fichier d'entrée.

Devrais-je en faire une fonction et l'appliquer à chaque rangée séparément ou y a-t-il une façon plus pythonique de le faire?

Répondre

3

Numpy est idéal lorsque vous voulez charger dans un tableau de nombres. Le format que vous avez ici est trop compliqué pour que numpy le reconnaisse, donc vous obtenez juste un tableau de chaînes. Ce n'est pas vraiment jouer à la force de numpy.

Voici une façon simple de le faire sans 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) 

cède

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

sur ces données:

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

Toutes ces réponses étaient excellentes, mais vous obtenez le contrôle pour le nombre de modifications et de révisions à votre réponse originale. Merci! – Stedy

1

Son assez facile à analyser le fichier entier sans expressions régulières:

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

Sauf si vous voulez vraiment utiliser NumPy, essayez ceci:

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

qui vient de passer dans chaque ligne du fichier , marque la ligne en utilisant le caractère de tabulation comme délimiteur, puis imprime la tranche du texte que vous recherchez.

0

Je n'ai pas écrit python dans un certain temps. Mais je l'écrirais probablement comme tel.

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

Bien sûr, si vous avez besoin de valider les trois premiers caractères, vous aurez toujours besoin de la regex.