it-swarm.com.de

So lesen Sie eine Textdatei in eine Liste oder ein Array mit Python

Ich versuche, die Zeilen einer Textdatei in eine Liste oder ein Array in Python zu lesen. Ich muss nur in der Lage sein, auf jedes Element in der Liste oder im Array einzeln zuzugreifen, nachdem es erstellt wurde.

Die Textdatei wird wie folgt formatiert:

0,0,200,0,53,1,0,255,...,0.

Wo der ... oben steht, enthält die eigentliche Textdatei Hunderte oder Tausende weitere Elemente.

Ich verwende den folgenden Code, um zu versuchen, die Datei in eine Liste einzulesen:

text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()

Die Ausgabe, die ich bekomme, ist:

['0,0,200,0,53,1,0,255,...,0.']
1

Anscheinend liest man die gesamte Datei in eine Liste mit nur einem Element und nicht in eine Liste mit einzelnen Elementen. Was mache ich falsch?

97
user2037744

Sie müssen Ihren String mit split() in eine Liste von Werten aufteilen

So,

lines = text_file.read().split(',')
100
Achrome

Die python-Methode file.readLines () gibt eine Liste der Zeilen in der Datei zurück:  

f = open('file_name.ext', 'r')
x = f.readlines()
f.close()

Jetzt sollten Sie in der Lage sein, das Array von Zeilen x zu durchlaufen.

Wenn Sie die Datei verwenden möchten und nicht daran denken müssen, sie danach zu schließen, führen Sie folgende Schritte aus:

with open('file_name.ext', 'r') as f:
    x = f.readlines()
87
user3752281

Sie können auch numpy loadtxt verwenden

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)
33
Thiru

Sie möchten also eine Liste mit Listen erstellen ... Wir müssen mit einer leeren Liste beginnen

list_of_lists = []

als nächstes lesen wir den Dateiinhalt Zeile für Zeile

with open('data') as f:
    for line in f:
        inner_list = [elt.strip() for elt in line.split(',')]
        # in alternative, if you need to use the file content as numbers
        # inner_list = [int(elt.strip()) for elt in line.split(',')]
        list_of_lists.append(inner_list)

Ein häufiger Anwendungsfall ist der von säulenförmigen Daten, aber unsere Speichereinheiten sind die -Zeilen der Datei, die wir einzeln gelesen haben. Daher möchten Sie transponieren Ihre Liste von Listen. Dies kann mit der folgenden Redewendung erfolgen

by_cols = Zip(*list_of_lists)

Eine andere übliche Verwendung ist, jeder Spalte einen Namen zu geben

col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
    by_names[col_name] = by_cols[i]

damit Sie mit homogenen Daten arbeiten können

 mean_Apple_prices = [money/fruits for money, fruits in
                     Zip(by_names['apples revenue'], by_names['apples_sold'])]

Das meiste, was ich geschrieben habe, kann mit dem Modul csv aus der Standardbibliothek beschleunigt werden. Ein weiteres Fremdanbieter-Modul ist pandas, mit dem Sie die meisten Aspekte einer typischen Datenanalyse automatisieren können (es gibt jedoch eine Reihe von Abhängigkeiten).


Update Während in Python 2 Zip(*list_of_lists) eine andere (transponierte) Listenliste zurückgibt, hat sich die Situation in Python 3 geändert und Zip(*list_of_lists) gibt ein Zip-Objekt zurück, das nicht subskribierbar ist.

Wenn Sie brauchen indizierten Zugriff haben, können Sie verwenden

by_cols = list(Zip(*list_of_lists))

dadurch erhalten Sie eine Liste von Listen in beiden Python-Versionen.

Auf der anderen Seite, wenn Sie nicht brauchen indizierten Zugriff haben und nur ein Wörterbuch erstellen möchten, das nach Spaltennamen indiziert ist, ist ein Zip-Objekt in Ordnung ...

file = open('some_data.csv')
names = get_names(next(file))
columns = Zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in Zip(names, columns): d[name] = column
14
gboffi

Diese Frage fragt, wie Sie den durch Kommas getrennten Wert aus einer Datei in eine iterierbare Liste einlesen können: 

0,0,200,0,53,1,0,255,...,0.

Am einfachsten geht das mit dem Modul csv wie folgt:

import csv
with open('filename.dat', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')

Nun können Sie spamreader wie folgt leicht durchlaufen:

for row in spamreader:
    print(', '.join(row))

Siehe Dokumentation für weitere Beispiele.

3
Blairg23
with open('D:\python\positive.txt', 'r') as myfile: data=myfile.read().replace('\n', '')
0
Eshan Chattaraj

Wenn Ihre Datei numerische Werte enthält, bietet sich die Methode loadtxt von numpy an. Sie können das Array wie folgt lesen:

import numpy as np

filename = '../data/NLPR_MCT/db3/cam1.dat'
x = np.loadtxt(filename, delimiter=',')
print (x)

Sie können Werte als Array in x indizieren, und file.readlines () ist unpraktisch, da es in jede Zeile '\ n' einfügt und die Indizierung möglicherweise fehlerhaft wird.

0