Hoe leest u een bestand in een lijst in Python? [DUPLICEER]

Ik wil een gebruiker vragen om een ​​aantal willekeurige nummers die moeten worden gegenereerd en opgeslagen in een bestand. Hij gaf ons dat deel. Het onderdeel dat we moeten doen is om dat bestand te openen, de nummers in een lijst te converteren en vervolgens de gemiddelde, standaarddeviatie, enz. Te vinden zonder gebruik te maken van de eenvoudig ingebouwde Python-gereedschappen.

Ik heb geprobeerd open, maar het geeft me ongeldige syntaxis (de bestandsnaam die ik heb gekozen, was “Numbers” en het is automatisch opgeslagen in "My Documents"Ik heb het open(numbers, 'r')en open(C:\name\MyDocuments\numbers, 'r')en geen van beide gewerkt).


Antwoord 1, Autoriteit 100%

with open('C:/path/numbers.txt') as f:
    lines = f.read().splitlines()

Hiermee geeft u een lijst met waarden (snaren) die u in uw bestand had, met nieuwe lijnen gestript.

Bekijk ook je backslashes in Windows Path-namen, omdat die ook ontsnappen aan tekens in snaren. In plaats daarvan kunt u in plaats daarvan naar voren slanker of dubbele backslashes gebruiken.


Antwoord 2, Autoriteit 41%

Twee manieren om het bestand in de lijst in Python te lezen (OPMERKING Deze zijn niet of) –

  1. Gebruik van with– ondersteund van Python 2.5 en hoger
  2. Gebruik van lijstbegrepen

1. Gebruik van with

Dit is de pythonische manier om bestanden te openen en te lezen.

#Sample 1 - elucidating each step but not memory efficient
lines = []
with open("C:\name\MyDocuments\numbers") as file:
    for line in file: 
        line = line.strip() #or some other preprocessing
        lines.append(line) #storing everything in memory!
#Sample 2 - a more pythonic and idiomatic way but still not memory efficient
with open("C:\name\MyDocuments\numbers") as file:
    lines = [line.strip() for line in file]
#Sample 3 - a more pythonic way with efficient memory usage. Proper usage of with and file iterators. 
with open("C:\name\MyDocuments\numbers") as file:
    for line in file:
        line = line.strip() #preprocess line
        doSomethingWithThisLine(line) #take action on line instead of storing in a list. more memory efficient at the cost of execution speed.

de .strip()wordt gebruikt voor elke regel van het bestand om het \nteken voor een nieuwe regel te verwijderen dat elke regel zou kunnen hebben. Wanneer de witheindigt, wordt het bestand automatisch voor je gesloten. Dit geldt zelfs als er een uitzondering in wordt gemaakt.

2. gebruik van lijstbegrip

Dit kan als inefficiënt worden beschouwd omdat de bestandsdescriptor mogelijk niet onmiddellijk wordt gesloten. Het kan een potentieel probleem zijn wanneer dit wordt aangeroepen in een functie die duizenden bestanden opent.

data = [line.strip() for line in open("C:/name/MyDocuments/numbers", 'r')]

Houd er rekening mee dat het sluiten van bestanden afhankelijk is van de implementatie. Normaal gesproken zijn ongebruikte variabelen afval verzameld door python-interpreter. In cPython (de reguliere interpreterversie van python.org) zal het onmiddellijk gebeuren, omdat de garbage collector werkt door referentietelling. In een andere tolk, zoals Jython of Iron Python, kan er een vertraging optreden.


Antwoord 3, autoriteit 23%

f = open("file.txt")
lines = f.readlines()

Kijk hier. readlines()retourneert een lijst met één regel per element. Merk op dat deze regels de \n(newline-karakter) aan het einde van de regel bevatten. Je kunt dit nieuwe regel-teken verwijderen door de strip()-methode te gebruiken. D.w.z. roep lines[index].strip()aan om de string te krijgen zonder het newline-teken.

Zoals Joaquin opmerkte, vergeet niet om het bestand f.close()te zetten.

Strint converteren naar gehele getallen is eenvoudig: int("12").


Antwoord 4, autoriteit 5%

De pythonische manier om een bestand te lezen en elke regel in een lijst te plaatsen:

from __future__ import with_statement #for python 2.5
with open('C:/path/numbers.txt', 'r') as f:
    lines = f.readlines()

Vervolgens, ervan uitgaande dat elke regel een nummer bevat,

numbers =[int(e.strip()) for e in lines]

Antwoord 5, autoriteit 3%

Je moet een bestandsnaamstring doorgeven aan open. Er is een extra complicatie wanneer de tekenreeks \bevat, omdat dat een speciaal tekenreeks-escape-teken is voor Python. U kunt dit oplossen door elk te verdubbelen als \\of door een rals volgt voor de tekenreeks te plaatsen: r'C:\name\MyDocuments\numbers'.

Bewerken:de bewerkingen van de vraag maken deze compleet anders dan het origineel, en aangezien geen van hen van de originele poster was, weet ik niet zeker of ze gegarandeerd zijn. Het wijst echter op een voor de hand liggend ding dat mogelijk over het hoofd is gezien, en dat is hoe u “Mijn documenten” aan een bestandsnaam kunt toevoegen.

In een Engelse versie van Windows XP is My Documentseigenlijk C:\Documents and Settings\name\My Documents. Dit betekent dat de open-aanroep er als volgt uit moet zien:

open(r"C:\Documents and Settings\name\My Documents\numbers", 'r')

Ik neem aan dat je XP gebruikt omdat je het My Documentsnoemt – het is veranderd in Vista en Windows 7. Ik weet niet of er een gemakkelijke manier is om dit automatisch op te zoeken in Python.


Antwoord 6, autoriteit 2%

hdl = open("C:/name/MyDocuments/numbers", 'r')
milist = hdl.readlines()
hdl.close()

Antwoord 7, autoriteit 2%

Om een beetje samen te vatten van wat mensen hebben gezegd:

f=open('data.txt', 'w') # will make a new file or erase a file of that name if it is present
f=open('data.txt', 'r') # will open a file as read-only
f=open('data.txt', 'a') # will open a file for appending (appended data goes to the end of the file)

Als je iets wilt hebben dat lijkt op een try/catch

with open('data.txt') as f:
    for line in f:
        print line

Ik denk dat @movieyoda-code waarschijnlijk is wat je echter zou moeten gebruiken


Antwoord 8

Als je meerdere getallen per regel hebt en je hebt meerdere regels, dan kun je ze als volgt inlezen:

   #!/usr/bin/env python
    from os.path import dirname
    with open(dirname(__file__) + '/data/path/filename.txt') as input_data:
        input_list= [map(int,num.split()) for num in input_data.readlines()]

Other episodes