Vraag Hoe lees ik in Python een bestand regel voor regel in een lijst?


Hoe lees ik elke regel van een bestand in Python en bewaar elke regel als een element in een lijst?

Ik wil het bestand regel voor regel lezen en elke regel toevoegen aan het einde van de lijst.


1694
2017-07-18 22:25


oorsprong


antwoorden:


with open(fname) as f:
    content = f.readlines()
# you may also want to remove whitespace characters like `\n` at the end of each line
content = [x.strip() for x in content] 

1649
2017-07-18 22:28



Zien Input en Ouput:

with open('filename') as f:
    lines = f.readlines()

of met het strippen van het nieuwelijnteken:

lines = [line.rstrip('\n') for line in open('filename')]

Noot van de redacteur: de originele opdracht voor witruimtestrippen van dit antwoord line.strip(), zoals geïmpliceerd door de opmerking van Janus Troelsen, zou verwijderen alles leidend en achterliggend witruimte, niet alleen de achterstand \n.


779
2017-07-18 22:28



Dit is meer expliciet dan nodig, maar doet wat je wilt.

with open("file.txt", "r") as ins:
    array = []
    for line in ins:
        array.append(line)

367
2017-07-18 22:27



Dit levert een "array" van regels uit het bestand op.

lines = tuple(open(filename, 'r'))

206
2017-07-18 22:27



Als je het wilt \n inbegrepen:

with open(fname) as f:
    content = f.readlines()

Als je niet wilt \n inbegrepen:

with open(fname) as f:
    content = f.read().splitlines()

150
2018-03-02 04:22



U kunt eenvoudig het volgende doen, zoals is gesuggereerd:

with open('/your/path/file') as f:
    my_lines = f.readlines()

Merk op dat deze benadering twee nadelen heeft:

1) U slaat alle lijnen in het geheugen op. In het algemene geval is dit een heel slecht idee. Het bestand kan erg groot zijn en er is mogelijk onvoldoende geheugen beschikbaar. Zelfs als het niet groot is, is het simpelweg een verspilling van geheugen.

2) Dit staat niet toe dat elke regel wordt verwerkt terwijl u ze leest. Dus als u daarna uw regels verwerkt, is deze niet efficiënt (vereist twee passen in plaats van één).

Een betere aanpak voor de algemene zaak zou de volgende zijn:

with open('/your/path/file') as f:
    for line in f:
        process(line)

Waar u uw procesfunctie op elke gewenste manier definieert. Bijvoorbeeld:

def process(line):
    if 'save the world' in line.lower():
         superman.save_the_world()

(De implementatie van de Superman klasse wordt overgelaten als oefening voor jou).

Dit werkt goed voor elke bestandsgrootte en u doorloopt uw ​​bestand in slechts 1 keer. Dit is meestal de manier waarop generieke parsers zullen werken.


91
2018-02-25 09:13



Als u het bestand niet wilt sluiten, werkt deze one-liner:

lines = open('file.txt').read().split("\n")

De traditioneel manier:

fp = open('file.txt') # Open file on read mode
lines = fp.read().split("\n") # Create a list containing all lines
fp.close() # Close file

Gebruik makend van with (aanbevolen):

with open('file.txt') as fp:
    lines = fp.read().split("\n")

61
2018-04-20 05:53



Dit zou het open commando moeten inkapselen.

array = []
with open("file.txt", "r") as f:
  for line in f:
    array.append(line)

38
2017-10-28 15:40



Gegevens in lijst

Stel dat we een tekstbestand met onze gegevens hebben zoals in de volgende regels:

Tekstbestand inhoud:

   line 1
   line 2
   line 3
  • Open het cmd in dezelfde map (klik met de rechtermuisknop en kies cmd of PowerShell)
  • Rennen python en schrijf in de tolk:

Het Python-script

>>> with open("myfile.txt", encoding="utf-8") as file:
...     x = [l.strip() for l in file]
>>> x
['line 1','line 2','line 3']

Gebruik append

x = []
with open("myfile.txt") as file:
    for l in file:
        x.append(l.strip())

Of...

>>> x = open("myfile.txt").read().splitlines()
>>> x
['line 1', 'line 2', 'line 3']

Of...

>>> y = [x.rstrip() for x in open("my_file.txt")]
>>> y
['line 1','line 2','line 3']

36
2018-04-26 04:57