Hoe lees je een tekstbestand in een lijst of een array met Python

Ik probeer de regels van een tekstbestand in een lijst of array in python te lezen. Ik moet alleen individueel toegang hebben tot elk item in de lijst of array nadat het is gemaakt.

Het tekstbestand is als volgt opgemaakt:

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

Waar de ...hierboven staat, bevat het daadwerkelijke tekstbestand honderden of duizenden meer items.

Ik gebruik de volgende code om te proberen het bestand in een lijst te lezen:

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

De output die ik krijg is:

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

Blijkbaar leest het het hele bestand in een lijst van slechts één item, in plaats van een lijst met individuele items. Wat doe ik verkeerd?


Antwoord 1, autoriteit 100%

Je moet je string opsplitsen in een lijst met waarden met behulp van split()

Dus,

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

BEWERKEN:
Ik wist niet dat hier zoveel grip op zou zijn. Hier is een meer idiomatische benadering.

import csv
with open('filename.csv', 'r') as fd:
    reader = csv.reader(fd)
    for row in reader:
        # do something

Antwoord 2, autoriteit 35%

Je kunt ook numpy loadtxt gebruiken zoals

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

Antwoord 3, Autoriteit 15%

Dus u wilt een lijst met lijsten maken … We moeten beginnen met een lege lijst

list_of_lists = []

Vervolgens lezen we de bestandsinhoud, regel per regel

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)

Een gemeenschappelijk gebruikscase is dat van kolomaregegevens, maar onze opslageenheden zijn de
Rijen van het bestand, dat we één voor één hebben gelezen, dus misschien wilt u Transpose
Uw lijst met lijsten. Dit kan worden gedaan met het volgende idioom

by_cols = zip(*list_of_lists)

Een ander gemeenschappelijk gebruik is om een ​​naam te geven aan elke kolom

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]

zodat u kunt werken op homogene gegevensitems

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

Het meeste van wat ik heb geschreven kan worden versneld met behulp van de module csvuit de standaardbibliotheek. Een andere module van derden is pandas, waarmee u de meeste aspecten van een typische gegevensanalyse kunt automatiseren (maar heeft een aantal afhankelijkheden).


UpdateTerwijl in Python 2 zip(*list_of_lists)een andere (getransponeerde) lijst met lijsten retourneert, is in Python 3 de situatie veranderd en zip(*list_of_lists)retourneert een zip-objectdat niet kan worden onderschreven.

Als u geïndexeerde toegangnodig heeft, kunt u gebruik maken van

by_cols = list(zip(*list_of_lists))

dat geeft je een lijst met lijsten in beide versies van Python.

Aan de andere kant, als je geengeïndexeerde toegang nodig hebt en je wilt gewoon een woordenboek bouwen dat is geïndexeerd op kolomnamen, dan is een zip-object prima…

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

Antwoord 4, autoriteit 4%

Deze vraag vraagt hoe de door komma’s gescheiden inhoud van een bestand in een itereerbare lijst kan worden gelezen:

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

De eenvoudigste manier om dit te doen is met de module csvals volgt:

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

Je kunt nu gemakkelijk herhalen over spamreaderals volgt:

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

Zie Documentatie voor meer voorbeelden.

Other episodes