2009-01-27 5 views
-3

J'ai un fichier qui contient la table de symboles details.Its sous la forme de lignes et de colonnes.Analyse d'un fichier avec des données de colonne en Python

J'ai besoin d'extraire la première et la dernière colonne.

Comment puis-je faire cela?

+0

Vous devrez décrire plus en détail le format de votre fichier "table de symboles". Est-ce du texte? Les "lignes" sont-elles terminées par des sauts de ligne (\ n)? Comment les colonnes sont-elles séparées? Largeur fixe? Des virgules? Les points-virgules Onglets? – bendin

+0

colonnes sont séparés avec espace – user46646

+1

S'il vous plaît modifier la question pour ajouter de nouveaux faits, @rejinacm. –

Répondre

4

Quel type de délimiteur utilisez-vous? Autrement dit, qu'est-ce qui sépare vos colonnes?

Je suppose que vous utilisez des virgules délimiteurs, comme ceci:

col1, col2, col3 
col11, col12, col13 
col21, col22, col23 
col31, col32, col33 

Le code suivant analysera et imprimer les première et dernière colonnes de chaque rangée:

# open file to read 
f = file('db.txt', 'r') 

# iterate over the lines in the file 
for line in f: 
    # split the line into a list of column values 
    columns = line.split(',') 
    # clean any whitespace off the items 
    columns = [col.strip() for col in columns] 

    # ensure the column has at least one value before printing 
    if columns: 
     print "first", columns[0] # print the first column 
     print "last", columns[-1] # print the last column 
+0

Pour les fichiers CSV, vous devez utiliser le module csv. – habnabit

+0

@Aaron, l'auteur n'a pas précisé qu'il utilise CSV, donc Soviut a présenté une bonne solution car elle montre ce qui se passe et peut donc être modifiée plus facilement. –

+0

@Sovis: Utiliser "," est déroutant, car CSV est bien défini et n'est pas ceci. Utiliser "" est un meilleur choix car il ne chevauche pas CSV. –

4

Le Le moyen le plus pratique d'analyser les tables écrites dans des fichiers texte consiste à utiliser le csv module. Il prend en charge n'importe quel délimiteur et est plus pratique à utiliser que l'analyse manuelle ligne par ligne. Exemple:

import csv 

def get_first_and_last_column(filename, separator): 
    with file(filename, 'rb') as file_obj: 
     for line in csv.reader(file_obj, 
       delimiter=separator, # Your custom delimiter. 
       skipinitialspace=True): # Strips whitespace after delimiter. 
      if line: # Make sure there's at least one entry. 
       yield line[0], line[-1] 

if __name__ == '__main__': 
    for pair in get_first_and_last_column(r'c:\temp\file.txt', ';'): 
     print pair 

Maintenant, si vous lui donnez un fichier comme ceci:

Edgar; Alan; Poe 
John; Smith 

Lots; of; whitespace; here 

Il produira la sortie suivante:

('Edgar', 'Poe') 
('John', 'Smith') 
('Lots', 'here') 

EDIT: paramètres personnalisés à csv.reader peut être passé comme arguments de mot-clé, aussi (merci, nosklo!).

+0

Inutile complexe - Si vous faites quelque chose de simple, vous n'avez pas besoin de créer un nouveau dialecte, passez juste les params: csv.reader (file_obj, délimiteur = '|', skipinitialspace = True). – nosklo

+0

Cool, merci, je ne le savais pas :-) – DzinX

13

csv module est le moyen le plus simple. Vous pouvez utiliser un séparateur avec ce code:

import csv 

def import_text(filename, separator): 
    for line in csv.reader(open(filename), delimiter=separator, 
          skipinitialspace=True): 
     if line: 
      yield line 

for data in import_text('somefile.txt', '/'): 
    print (data) 
+1

Que fait "if line"? Ignorer les lignes vides? – pufferfish

+1

pufferfish: oui. – nosklo

0

Selon la mise à jour, les colonnes sont séparés avec l'espace. Ce serait donc:

rawfile = open('details.Its', 'r') 
table = [line.rstrip().split() for line in rawfile.readlines()] 

newtable = [[line[0]]+[line[-1]] for line in table] 
print(newtable) 
Questions connexes