web-dev-qa-db-fra.com

Importation d'un gros fichier .text délimité par des tabulations dans Python

J'ai un fichier .txt délimité par des tabulations que j'essaie d'importer dans un tableau matriciel au Python du même format que le fichier texte est comme indiqué ci-dessous:

123088 266 248 244 266 244 277

123425 275 244 241 289 248 231

123540 156 654 189 354 156 987

Notez qu'il y a beaucoup, beaucoup plus de lignes des éléments ci-dessus (environ 200) que je veux passer dans Python et conserver le même formatage lors de la création d'un tableau matriciel à partir de celui-ci.

Le code actuel que j'ai pour cela est:

d = {}
with open('file name', 'rb') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter='\t')
    for row in csv_reader:
        d[row[0]] = row[1:]

Ce qui fait légèrement ce que j'ai besoin de faire, mais pas mon objectif cible. Je veux terminer le code que je peux taper dans print (d [0,3]) et il crachera 248.

13
user2464402

Tout d'abord, vous le chargez dans un dictionnaire, qui ne va pas obtenir la liste des listes que vous souhaitez.

Il est très simple d'utiliser le module CSV pour générer une liste de listes comme celle-ci:

import csv
with open(path) as f:
    reader = csv.reader(f, delimiter="\t")
    d = list(reader)
print d[0][2] # 248

Cela vous donnerait une liste de listes de chaînes, donc si vous vouliez obtenir des nombres, vous devriez convertir en int.

Cela dit, si vous avez un grand tableau (ou faites des calculs numériques), vous devriez envisager d'utiliser quelque chose comme NumPy ou pandas . Si vous vouliez utiliser NumPy, vous pourriez le faire

import numpy as np
d = np.loadtxt(path, delimiter="\t")
print d[0,2] # 248

En prime, les tableaux NumPy vous permettent d'effectuer des opérations vectorielles/matricielles rapides. (Notez également que d[0][2] fonctionnerait également avec le tableau NumPy).

27
Jeff Tratner

Essaye ça:

d = []
with open(sourcefile,'rb') as source:
    for line in source:
        fields = line.split('\t')
        d.append(fields)

print d[0][1] imprimera 266.

print d[0][2] (rappelez-vous que vos tableaux sont basés sur 0) affichera 248.

Pour sortir les données dans le même format que votre entrée:

for line in d:
    print "\t".join(line)
3
jsucsy

Je ne sais pas comment faire de print(d[0,3]) sortie 248, mais cela fera print(d[0][3]) sortie 248. Première réponse StackOverflow donc IDK comment montrer que les deux dernières lignes de mon bloc de code ne sont en fait qu'une seule longue ligne.

import csv

Text_Input = r"<.txt file>"  
listoflists= []

with open(Text_Input) as txtfile:
    reader = csv.reader(txtfile)

    for row in reader:
        listoflists.append([int(row[0].split()[i]) for i in 
        range(len(row[0].split()))])
0
K Butler