2009-11-10 3 views
1

est-il possible en Python, étant donné un fichier avec 10000 lignes, où tous ont cette structure:Comment lire, en ligne, tous les caractères de la colonne A à B

1, 2, xvfrt ert5a fsfs4 df f fdfd56, 234

ou similaire, à lire toute la chaîne, puis de stocker dans une autre chaîne tous les caractères de la colonne 7 à la colonne 17, y compris les espaces, de sorte que la nouvelle chaîne serait

« xvfrt ert5a "?

Merci beaucoup

Répondre

1

Cela répond à la question technique directe:

lst = [line[6:17] for line in open(fname)] 

mais il y a une erreur fatale. C'est correct pour le code jetable, mais cette donnée ressemble étrangement à des valeurs séparées par des virgules, et le troisième champ peut même être constitué de blocs de données délimités par des espaces. Il vaut bien mieux le faire comme cela pour que si les deux premières colonnes germent un chiffre supplémentaire, il fonctionne toujours:

lst = [x[2].strip()[0:11] for x in [line.split(',') for line in open(fname)]] 

Et si ces morceaux séparés par des espaces pourraient obtenir plus, alors ceci:

lst = [x[2].strip().split()[0:2] for x in [line.split(',') for line in open(fname)]] 

Ne pas oublier un commentaire ou deux pour expliquer ce qui se passe. Peut-être:

# on each line, get the 3rd comma-delimited field and break out the 
# first two space-separated chunks of the licence key 

En supposant, bien sûr, que ce sont des clés de licence. Pas besoin d'être trop abstrait dans les commentaires.

0
for l in open("myfile.txt"): 
    c7_17 = l[6:17] 
    # Not sure what you want to do with c7_17 here, but go for it! 
5
another_list = [] 
for line in f: 
    another_list.append(line[6:17]) 

Ou comme un générateur (une mémoire de solution amiable):

another_list = (line[6:17] for line in f) 
+0

En fait, il devrait être [6:17]. +1 pour la version du générateur! – ema

+0

@ema, à droite! Merci pour la correction –

1

Vous ne dites pas comment vous voulez stocker les données de chacun des les 10.000 lignes - si vous les voulez dans une liste, vous feriez quelque chose comme ceci:

my_list = [] 

for line in open(filename): 
    my_list.append(line[7:18]) 
7
lst = [line[6:17] for line in open(fname)] 
0

Cette functionw calculera la chaîne que vous voulez et l'imprimer

def readCols(filepath): 
    f = open(filepath, 'r') 
     for line in file: 
      newString = line[6:17] 
      print newString 
2

Je vais aller un peu plus loin dans la réponse de Michael Dillon. Si par "colonnes 6 à 17" vous voulez dire "les 11 premiers caractères du troisième champ séparé par des virgules", c'est une bonne occasion d'utiliser le module csv. En outre, pour Python 2.6 et supérieur, il est recommandé d'utiliser l'instruction 'with' lors de l'ouverture de fichiers. Voici:

import csv 
with open(filepath, 'rt') as f: 
    lst = [row[2][:11] for row in csv.reader(f)] 

Cela préserve l'espace blanc de début; Si vous ne le souhaitez pas, modifiez la dernière ligne à

lst = [row[2].lstrip()[:11] for row in csv.reader(f)]