it-swarm.com.de

Wie liest man eine Datei Zeile für Zeile in eine Liste ein?

Wie lese ich jede Zeile einer Datei in Python und speichere jede Zeile als Element in einer Liste? 

Ich möchte die Datei Zeile für Zeile lesen und jede Zeile an das Ende der Liste anhängen.

1922
Julie Raswick
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] 
1883
SilentGhost

Siehe Eingabe und Ausgabe :

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

oder mit dem Strippen des Newline-Zeichens:

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

Anmerkung des Herausgebers: Der ursprüngliche Whitespace-Stripping-Befehl line.strip(), wie er durch den Kommentar von Janus Troelsen impliziert wird, würde alle führenden und nachgestellten Whitespaces entfernen, nicht nur den nachgestellten \n.

849
Felix Kling

Dies ist expliziter als nötig, macht aber was Sie wollen.

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

Dies ergibt ein "Array" von Zeilen aus der Datei.

lines = Tuple(open(filename, 'r'))
236
Noctis Skytower

Wenn Sie möchten, dass der \n enthalten ist:

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

Wenn Sie nicht möchten, dass \n enthalten ist:

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

Sie können einfach wie folgt vorgehen:

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

Beachten Sie, dass dieser Ansatz zwei Nachteile hat:

1) Sie speichern alle Zeilen im Speicher. Im Allgemeinen ist das eine sehr schlechte Idee. Die Datei kann sehr umfangreich sein, und der Speicher kann ausgehen. Auch wenn es nicht groß ist, ist es einfach eine Verschwendung von Gedächtnis.

2) Dies erlaubt keine Verarbeitung jeder Zeile, während Sie sie lesen. Wenn Sie Ihre Zeilen danach bearbeiten, ist dies nicht effizient (erfordert zwei Durchgänge statt eines).

Ein besserer Ansatz für den allgemeinen Fall wäre folgender:

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

Wo Sie Ihre Prozessfunktion auf beliebige Weise definieren. Zum Beispiel:

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

(Die Implementierung der Klasse Superman bleibt Ihnen als Übung überlassen).

Dies funktioniert gut für jede Dateigröße und Sie gehen Ihre Datei in nur einem Durchgang durch. Normalerweise funktionieren generische Parser so.

121
DevShark

Wenn Sie die Datei nicht schließen möchten, funktioniert dieser One-Liner:

lines = open('file.txt').readlines()

Der traditionelle Weg:

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

Verwendung von with und readlines() (empfohlen) :

with open('file.txt') as fp:
    lines = fp.readlines()
97
Pedro Lobito

Daten in die Liste

Angenommen, wir haben eine Textdatei mit unseren Daten wie in den folgenden Zeilen:

Inhalt der Textdatei:

line 1
line 2
line 3
  • Öffnen Sie die cmd im selben Verzeichnis (klicken Sie mit der rechten Maustaste und wählen Sie cmd oder PowerShell).
  • Führen Sie python aus und schreiben Sie in den Interpreter:

Das Python-Skript

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

Anhängen verwenden

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

Oder...

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

Oder...

>>> x = open("myfile.txt").readlines()
>>> x
['linea 1\n', 'line 2\n', 'line 3\n']

Oder...

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


with open('testodiprova.txt', 'r', encoding='utf-8') as file:
    file = file.read().splitlines()
  print(file)

with open('testodiprova.txt', 'r', encoding='utf-8') as file:
  file = file.readlines()
  print(file)
53
Giovanni Gianni

Dies sollte den Open-Befehl einkapseln. 

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

Um eine Datei in eine Liste einzulesen, müssen Sie drei Dinge tun:

  • Öffne die Datei
  • Lesen Sie die Datei
  • Speichern Sie den Inhalt als Liste

Glücklicherweise macht es Python sehr einfach, diese Dinge zu tun, so dass der kürzeste Weg zum Einlesen einer Datei in eine Liste ist:

lst = list(open(filename))

Ich werde jedoch noch eine Erklärung hinzufügen.

Datei öffnen

Ich gehe davon aus, dass Sie eine bestimmte Datei öffnen möchten und nicht direkt mit einem Datei-Handle (oder einem Datei-ähnlichen Handle) arbeiten. Die am häufigsten verwendete Funktion zum Öffnen einer Datei in Python ist open . In Python 2.7:

  • Dateiname
  • Modus
  • Pufferung (ich werde dieses Argument in dieser Antwort ignorieren)

Der Dateiname sollte eine Zeichenfolge sein, die den Pfad zur Datei darstellt. Zum Beispiel:

open('afile')   # opens the file named afile in the current working directory
open('adir/afile')            # relative path (relative to the current working directory)
open('C:/users/aname/afile')  # absolute path (windows)
open('/usr/local/afile')      # absolute path (linux)

Beachten Sie, dass die Dateierweiterung angegeben werden muss. Dies ist besonders für Windows-Benutzer wichtig, da Dateierweiterungen wie .txt Oder .doc Usw. ausgeblendet sind standardmäßig, wenn sie im Explorer angezeigt werden.

Das zweite Argument ist das mode, es ist standardmäßig r, was "schreibgeschützt" bedeutet. Genau das brauchen Sie in Ihrem Fall.

Wenn Sie jedoch tatsächlich eine Datei erstellen und/oder in eine Datei schreiben möchten, benötigen Sie hier ein anderes Argument. Es gibt eine ausgezeichnete Antwort, wenn Sie einen Überblick wünschen .

Zum Lesen einer Datei können Sie das mode weglassen oder explizit übergeben:

open(filename)
open(filename, 'r')

Beide öffnen die Datei im schreibgeschützten Modus. Wenn Sie eine Binärdatei unter Windows einlesen möchten, müssen Sie den Modus rb verwenden:

open(filename, 'rb')

Auf anderen Plattformen wird der 'b' (Binärmodus) einfach ignoriert.


Nachdem ich Ihnen gezeigt habe, wie Sie die Datei open bearbeiten können, lassen Sie uns über die Tatsache sprechen, dass Sie sie immer wieder close benötigen. Andernfalls behält es ein offenes Datei-Handle für die Datei bei, bis der Prozess beendet wird (oder Python beschädigt das Datei-Handle).

Während Sie verwenden könnten:

f = open(filename)
# ... do stuff with f
f.close()

Dadurch wird die Datei nicht geschlossen, wenn zwischen open und close eine Ausnahme ausgelöst wird. Sie können dies vermeiden, indem Sie try und finally verwenden:

f = open(filename)
# nothing in between!
try:
    # do stuff with f
finally:
    f.close()

Python stellt Kontextmanager mit einer schöneren Syntax zur Verfügung (aber für open ist es fast identisch mit try und finally oben):

with open(filename) as f:
    # do stuff with f
# The file is always closed after the with-scope ends.

Der letzte Ansatz ist der empfohlene Ansatz zum Öffnen einer Datei in Python!

Datei lesen

Okay, du hast die Datei geöffnet, wie lese ich sie jetzt?

Die Funktion open gibt ein file -Objekt zurück und unterstützt das Pythons-Iterationsprotokoll. Bei jeder Iteration erhalten Sie eine Zeile:

with open(filename) as f:
    for line in f:
        print(line)

Dadurch wird jede Zeile der Datei gedruckt. Beachten Sie jedoch, dass jede Zeile am Ende ein Zeilenumbruchzeichen \n Enthält (Sie möchten möglicherweise überprüfen, ob Ihr Python mit nterstützung für universelle Zeilenumbrüche erstellt wurde) - Andernfalls könnten Sie unter Windows auch \r\n oder unter Mac \r als Zeilenumbruch haben.) Wenn Sie dies nicht möchten, können Sie einfach das letzte Zeichen (oder die letzten beiden Zeichen unter Windows) entfernen ):

with open(filename) as f:
    for line in f:
        print(line[:-1])

Die letzte Zeile muss jedoch nicht unbedingt eine abschließende neue Zeile enthalten, daher sollte diese nicht verwendet werden. Man könnte prüfen, ob es mit einem abschließenden Zeilenumbruch endet und wenn ja, entfernen:

with open(filename) as f:
    for line in f:
        if line.endswith('\n'):
            line = line[:-1]
        print(line)

Sie können jedoch einfach alle Leerzeichen (einschließlich des Zeichens \n) Aus dem Zeichen Ende der Zeichenfolge entfernen. Dadurch werden auch alle anderen Zeichen am Ende entfernt Leerzeichen, daher müssen Sie vorsichtig sein, wenn diese wichtig sind:

with open(filename) as f:
    for line in f:
        print(f.rstrip())

Wenn die Zeilen jedoch mit \r\n Enden (Windows "newlines"), kümmert sich .rstrip() auch um den \r!

Speichern Sie den Inhalt als Liste

Nachdem Sie nun wissen, wie Sie die Datei öffnen und lesen, ist es Zeit, den Inhalt in einer Liste zu speichern. Die einfachste Möglichkeit wäre die Verwendung der Funktion list :

with open(filename) as f:
    lst = list(f)

Wenn Sie die nachfolgenden Zeilenumbrüche entfernen möchten, können Sie stattdessen ein Listenverständnis verwenden:

with open(filename) as f:
    lst = [line.rstrip() for line in f]

Oder noch einfacher: Die Methode .readlines() des Objekts file gibt standardmäßig ein list der Zeilen zurück:

with open(filename) as f:
    lst = f.readlines()

Dies schließt auch die nachgestellten Zeilenumbrüche ein. Wenn Sie diese nicht möchten, würde ich den Ansatz [line.rstrip() for line in f] empfehlen, da dadurch vermieden wird, dass zwei Listen mit allen Zeilen im Speicher bleiben.

Es gibt eine zusätzliche Option, um die gewünschte Ausgabe zu erhalten, sie ist jedoch eher "suboptimal": read die gesamte Datei in einem String und dann in Zeilenumbrüche aufgeteilt:

with open(filename) as f:
    lst = f.read().split('\n')

oder:

with open(filename) as f:
    lst = f.read().splitlines()

Diese kümmern sich automatisch um die nachfolgenden Zeilenumbrüche, da das Zeichen split nicht enthalten ist. Sie sind jedoch nicht ideal, da Sie die Datei als Zeichenfolge und als Liste von Zeilen im Speicher behalten!

Zusammenfassung

  • Verwenden Sie with open(...) as f, wenn Sie Dateien öffnen, da Sie nicht dafür sorgen müssen, dass die Datei selbst geschlossen wird, und die Datei auch dann geschlossen wird, wenn eine Ausnahme auftritt.
  • file -Objekte unterstützen das Iterationsprotokoll, sodass das zeilenweise Lesen einer Datei so einfach ist wie for line in the_file_object:.
  • Durchsuchen Sie die Dokumentation immer nach den verfügbaren Funktionen/Klassen. Meistens gibt es eine perfekte Übereinstimmung für die Aufgabe oder mindestens ein oder zwei gute. Die naheliegende Wahl in diesem Fall wäre readlines(), aber wenn Sie die Zeilen vor dem Speichern in der Liste verarbeiten möchten, würde ich ein einfaches Listenverständnis empfehlen.
40
MSeifert

Saubere und pythonische Art und Weise, die Zeilen einer Datei in eine Liste zu lesen


In erster Linie sollten Sie sich darauf konzentrieren, Ihre Datei zu öffnen und den Inhalt auf effiziente und pythonische Weise zu lesen. Hier ist ein Beispiel, wie ich persönlich NICHT ziehe:

infile = open('my_file.txt', 'r')  # Open the file for reading.

data = infile.read()  # Read the contents of the file.

infile.close()  # Close the file since we're done using it.

Stattdessen bevorzuge ich die unten beschriebene Methode zum Öffnen von Dateien sowohl zum Lesen als auch zum Schreiben, da es sehr sauber ist und kein zusätzlicher Schritt zum Schließen der Datei erforderlich ist, nachdem Sie damit fertig sind. In der folgenden Anweisung öffnen wir die Datei Zum Lesen und weisen sie der Variablen 'infile' zu. Sobald der Code in Dieser Anweisung ausgeführt wurde, wird die Datei automatisch geschlossen.

# Open the file for reading.
with open('my_file.txt', 'r') as infile:

    data = infile.read()  # Read the contents of the file into memory.

Nun müssen wir uns darauf konzentrieren, diese Daten in eine Python-Liste aufzunehmen, da sie iterierbar, effizient und flexibel sind. In Ihrem Fall besteht das gewünschte Ziel darin, jede Zeile der Textdatei in ein separates Element zu bringen. Um dies zu erreichen, verwenden wir die Methode splitlines () wie folgt:

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()

Das Endprodukt:

# Open the file for reading.
with open('my_file.txt', 'r') as infile:

    data = infile.read()  # Read the contents of the file into memory.

# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()

Testen unseres Codes:

  • Inhalt der Textdatei:
     A fost odatã ca-n povesti,
     A fost ca niciodatã,
     Din rude mãri împãrãtesti,
     O prea frumoasã fatã.
  • Anweisungen zu Testzwecken ausdrucken:
    print my_list  # Print the list.

    # Print each line in the list.
    for line in my_list:
        print line

    # Print the fourth element in this list.
    print my_list[3]
  • Ausgabe (sieht aufgrund von Unicode-Zeichen anders aus):
     ['A fost odat\xc3\xa3 ca-n povesti,', 'A fost ca niciodat\xc3\xa3,',
     'Din rude m\xc3\xa3ri \xc3\xaemp\xc3\xa3r\xc3\xa3testi,', 'O prea
     frumoas\xc3\xa3 fat\xc3\xa3.']

     A fost odatã ca-n povesti, A fost ca niciodatã, Din rude mãri
     împãrãtesti, O prea frumoasã fatã.

     O prea frumoasã fatã.
38
Johnny

Ich würde es so machen.

lines = []
with open("myfile.txt") as f:
    for line in f:
        lines.append(line)
29
user3394040

Hier ist noch eine weitere Option, indem Sie Listenauffassungen in Dateien verwenden.

lines = [line.rstrip() for line in open('file.txt')]

Dies sollte effizienter sein, da der größte Teil der Arbeit innerhalb des Python-Interpreters ausgeführt wird.

24
user1833244

Eine andere Option ist numpy.genfromtxt , zum Beispiel:

import numpy as np
data = np.genfromtxt("yourfile.dat",delimiter="\n")

Dies macht data zu einem NumPy-Array mit so vielen Zeilen wie in Ihrer Datei.

23
atomh33ls

Wenn Sie eine Datei von der Befehlszeile oder von stdin lesen möchten, können Sie auch das Modul fileinput verwenden:

# reader.py
import fileinput

content = []
for line in fileinput.input():
    content.append(line.strip())

fileinput.close()

Dateien so übergeben:

$ python reader.py textfile.txt 

Lesen Sie hier mehr: http://docs.python.org/2/library/fileinput.html

21
oliland

Der einfachste Weg, es zu tun

Ein einfacher Weg ist:

  1. Lesen Sie die gesamte Datei als Zeichenfolge
  2. Teilen Sie die Zeichenfolge Zeile für Zeile

In einer Zeile würde das ergeben:

lines = open('C:/path/file.txt').read().splitlines()
17

Lesen und Schreiben von Textdateien mit Python 2 und Python 3; es funktioniert mit Unicode

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Define data
lines = ['     A first string  ',
         'A Unicode sample: €',
         'German: äöüß']

# Write text file
with open('file.txt', 'w') as fp:
    fp.write('\n'.join(lines))

# Read text file
with open('file.txt', 'r') as fp:
    read_lines = fp.readlines()
    read_lines = [line.rstrip('\n') for line in read_lines]

print(lines == read_lines)

Dinge zu beachten:

  • with ist ein sogenannter context manager . Es stellt sicher, dass die geöffnete Datei wieder geschlossen wird.
  • Alle Lösungen hier, die einfach .strip() oder .rstrip() machen, werden die lines nicht reproduzieren, da sie auch den Leerraum entfernen.

Gemeinsame Dateiendungen

.txt

Fortgeschrittenes Schreiben und Lesen von Dateien

Für Ihre Bewerbung kann Folgendes wichtig sein:

  • Unterstützung durch andere Programmiersprachen
  • Lese-/Schreibperformance
  • Kompaktheit (Dateigröße)

Siehe auch: Vergleich der Datenserialisierungsformate

Wenn Sie eher nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, möchten Sie vielleicht meinen kurzen Artikel Konfigurationsdateien in Python lesen.

17
Martin Thoma

pathlib wurde in Python 3.4 eingeführt und bietet eine sehr bequeme Methode zum Einlesen von Text aus Dateien:

from pathlib import Path
p = Path('my_text_file')
lines = p.read_text().splitlines()

(Der Aufruf splitlines ist es, der ihn von einer Zeichenfolge, die den gesamten Inhalt der Datei enthält, in eine Liste von Zeilen in der Datei umwandelt).

pathlib hat viele praktische Annehmlichkeiten. read_text ist nett und prägnant, und Sie müssen sich keine Sorgen um das Öffnen und Schließen der Datei machen. Wenn Sie mit der Datei nur noch alles auf einmal lesen, ist dies eine gute Wahl.

16
LangeHaare
f = open("your_file.txt",'r')
out = f.readlines() # will append in the list out

Variable out ist jetzt eine Liste (Array) von dem, was Sie wollen. Sie könnten entweder tun:

for line in out:
    print line

oder

for line in f:
    print line

sie erhalten die gleichen Ergebnisse.

15
moldovean

Verwenden Sie einfach die Funktionen von splitlines (). Hier ist ein Beispiel.

inp = "file.txt"
data = open(inp)
dat = data.read()
lst = dat.splitlines()
print lst
# print(lst) # for python 3

In der Ausgabe haben Sie die Liste der Zeilen.

13
Abdullah Bilal

Ein ganz einfacher Weg:

with open(file) as g:
    stuff = g.readlines()

Wenn Sie ein vollwertiges Programm erstellen möchten, geben Sie Folgendes ein:

file = raw_input ("Enter EXACT file name: ")
with open(file) as g:
    stuff = g.readlines()
print (stuff)
exit = raw_input("Press enter when you are done.")

Aus irgendeinem Grund werden PY-Dateien nicht richtig gelesen.

13
user6111687

Sie können Ihre Datei einfach zum Lesen öffnen:

file1 = open("filename","r")
# And for reading use
lines = file1.readlines()
file1.close()

Die Liste lines enthält alle Ihre Zeilen als einzelne Elemente. Sie können ein bestimmtes Element mit lines["linenumber-1"] aufrufen, da Python mit der Zählung von 0 beginnt.

11
Diksha Dhawan

Wenn Sie mit einer sehr großen/großen Datei konfrontiert werden möchten und schneller lesen möchten (stellen Sie sich vor, Sie befinden sich in einem Topcoder/Hackerrank-Codierungswettbewerb), lesen Sie möglicherweise einen erheblich größeren Zeilenblock in eine Speicherpuffer auf einmal, anstatt nur zeilenweise auf Dateiebene zu iterieren.

buffersize = 2**16
with open(path) as f: 
    while True:
        lines_buffer = f.readlines(buffersize)
        if not lines_buffer:
            break
        for line in lines_buffer:
            process(line)
9
pambda

Meines Wissens verfügt Python nicht über eine native Array-Datenstruktur. Es unterstützt jedoch die Listendatenstruktur, die viel einfacher zu verwenden ist als ein Array.

array = [] #declaring a list with name '**array**'
with open(PATH,'r') as reader :
    for line in reader :
        array.append(line)
7
Strik3r

Die einfachste Möglichkeit, dies mit einigen zusätzlichen Vorteilen zu tun, sind:

lines = list(open('filename'))

oder

lines = Tuple(open('filename'))

oder

lines = set(open('filename'))

Im Fall von set muss beachtet werden, dass die Zeilenreihenfolge nicht beibehalten wird und die duplizierten Zeilen entfernt werden.

7
simhumileco

Sie können dies einfach mit dem folgenden Code tun:

lines = open(filePath).readlines()
4
Pedram

Hier ist ein Python (3) -Helfer bibliothek Klasse, mit der ich die Datei-E/A vereinfache:

import os

# handle files using a callback method, prevents repetition
def _FileIO__file_handler(file_path, mode, callback = lambda f: None):
  f = open(file_path, mode)
  try:
    return callback(f)
  except Exception as e:
    raise IOError("Failed to %s file" % ["write to", "read from"][mode.lower() in "r rb r+".split(" ")])
  finally:
    f.close()


class FileIO:
  # return the contents of a file
  def read(file_path, mode = "r"):
    return __file_handler(file_path, mode, lambda rf: rf.read())

  # get the lines of a file
  def lines(file_path, mode = "r", filter_fn = lambda line: len(line) > 0):
    return [line for line in FileIO.read(file_path, mode).strip().split("\n") if filter_fn(line)]

  # create or update a file (NOTE: can also be used to replace a file's original content)
  def write(file_path, new_content, mode = "w"):
    return __file_handler(file_path, mode, lambda wf: wf.write(new_content))

  # delete a file (if it exists)
  def delete(file_path):
    return os.remove() if os.path.isfile(file_path) else None

Sie würden dann die Funktion FileIO.lines wie folgt verwenden:

file_ext_lines = FileIO.lines("./path/to/file.ext"):
for i, line in enumerate(file_ext_lines):
  print("Line {}: {}".format(i + 1, line))

Beachten Sie, dass die Parameter mode (standardmäßig "r") und filter_fn (standardmäßig leere Zeilen) optional sind.

Sie können sogar die Methoden read, write und delete entfernen und einfach den FileIO.lines belassen oder ihn sogar in eine separate Methode namens read_lines umwandeln.

4
LogicalBranch

Benutze das:

import pandas as pd
data = pd.read_csv(filename) # You can also add parameters such as header, sep, etc.
array = data.values

data ist ein Dataframe-Typ und verwendet Werte, um ndarray abzurufen. Sie können eine Liste auch mit array.tolist() abrufen.

4
Zero

Gliederung und Zusammenfassung

Führen Sie mit einem filename, der die Datei von einem Path(filename) -Objekt verarbeitet, oder direkt mit open(filename) as f einen der folgenden Schritte aus:

  • list(fileinput.input(filename))
  • benutze with path.open() as f, um f.readlines() aufzurufen
  • list(f)
  • path.read_text().splitlines()
  • path.read_text().splitlines(keepends=True)
  • iterieren Sie nacheinander über fileinput.input oder f und list.append
  • übergeben Sie f an eine gebundene list.extend - Methode
  • benutze f in einem Listenverständnis

Ich erkläre den Anwendungsfall für jeden unten.

Wie lese ich in Python eine Datei Zeile für Zeile?

Dies ist eine ausgezeichnete Frage. Lassen Sie uns zunächst einige Beispieldaten erstellen:

from pathlib import Path
Path('filename').write_text('foo\nbar\nbaz')

Dateiobjekte sind langsame Iteratoren, iterieren Sie also einfach darüber.

filename = 'filename'
with open(filename) as f:
    for line in f:
        line # do something with the line

Wenn Sie mehrere Dateien haben, verwenden Sie alternativ fileinput.input, Einen anderen faulen Iterator. Mit nur einer Datei:

import fileinput

for line in fileinput.input(filename): 
    line # process the line

oder übergeben Sie für mehrere Dateien eine Liste mit Dateinamen:

for line in fileinput.input([filename]*2): 
    line # process the line

Wiederum sind f und fileinput.input Über beiden/return-Iteratoren. Sie können einen Iterator nur einmal verwenden. Um funktionalen Code bereitzustellen und gleichzeitig Ausführlichkeit zu vermeiden, verwende ich das etwas knappere fileinput.input(filename), in dem von hier aus vorgeschlagen wird.

Wie lese ich in Python eine Datei Zeile für Zeile in eine Liste?

Ah, aber du willst es aus irgendeinem Grund in einer Liste haben? Ich würde das wenn möglich vermeiden. Aber wenn Sie darauf bestehen ... übergeben Sie einfach das Ergebnis von fileinput.input(filename) an list:

list(fileinput.input(filename))

Eine weitere direkte Antwort ist der Aufruf von f.readlines, Das den Inhalt der Datei zurückgibt (bis zu einer optionalen hint Anzahl von Zeichen, sodass Sie Teilen Sie dies auf diese Weise in mehrere Listen auf.

Sie können auf zwei Arten zu diesem Dateiobjekt gelangen. Eine Möglichkeit besteht darin, den Dateinamen an das integrierte open zu übergeben:

filename = 'filename'

with open(filename) as f:
    f.readlines()

oder verwenden Sie das neue Path-Objekt aus dem pathlib -Modul (das ich mittlerweile sehr mag und von hier an verwenden werde):

from pathlib import Path

path = Path(filename)

with path.open() as f:
    f.readlines()

list verbraucht auch den Datei-Iterator und gibt eine Liste zurück - eine sehr direkte Methode:

with path.open() as f:
    list(f)

Wenn es Ihnen nichts ausmacht, den gesamten Text vor dem Aufteilen als einzelne Zeichenfolge in den Speicher zu lesen, können Sie dies mit dem Objekt Path und der Zeichenfolgemethode splitlines() als einzeilige Zeichenfolge tun. Standardmäßig entfernt splitlines die Zeilenumbrüche:

path.read_text().splitlines()

Wenn Sie die Zeilenumbrüche beibehalten möchten, übergeben Sie keepends=True:

path.read_text().splitlines(keepends=True)

Ich möchte die Datei zeilenweise lesen und jede Zeile an das Ende der Liste anhängen.

Das ist ein bisschen albern zu fragen, da wir das Endergebnis leicht mit verschiedenen Methoden demonstriert haben. Möglicherweise müssen Sie jedoch die Zeilen filtern oder bearbeiten, während Sie Ihre Liste erstellen. Lassen Sie uns also diese Anfrage begrüßen.

Mit list.append Können Sie jede Zeile filtern oder bearbeiten, bevor Sie sie anhängen:

line_list = []
for line in fileinput.input(filename):
    line_list.append(line)

line_list

Die Verwendung von list.extend Wäre etwas direkter und möglicherweise nützlich, wenn Sie eine bereits vorhandene Liste haben:

line_list = []
line_list.extend(fileinput.input(filename))
line_list

Oder idiomatisch könnten wir stattdessen ein Listenverständnis verwenden und es, falls gewünscht, zuordnen und darin filtern:

[line for line in fileinput.input(filename)]

Oder noch direkter, um den Kreis zu schließen, übergeben Sie ihn einfach an list, um direkt eine neue Liste zu erstellen, ohne die Zeilen zu bearbeiten:

list(fileinput.input(filename))

Fazit

Sie haben viele Möglichkeiten gesehen, Zeilen aus einer Datei in eine Liste zu übernehmen. Ich empfehle jedoch, große Datenmengen nicht in einer Liste zu materialisieren und stattdessen Pythons langsame Iteration zu verwenden, um die Daten nach Möglichkeit zu verarbeiten.

Das heißt, bevorzugen Sie fileinput.input Oder with path.open() as f.

3
Aaron Hall

Schauen Sie sich diesen kurzen Ausschnitt an

fileOb=open("filename.txt","r")
data=fileOb.readlines() #returns a array of lines.

oder 

fileOb=open("filename.txt","r")
data=list(fileOb) #returns a array of lines.

siehe docs als Referenz

3
Seenivasan

Sie können auch den Befehl loadtxt in NumPy verwenden. Dies prüft, ob weniger Bedingungen als genfromtxt vorliegen, und kann daher schneller sein.

import numpy
data = numpy.loadtxt(filename, delimiter="\n")
3
asampat3090

Ich würde eine der unten genannten Methoden ausprobieren. Die von mir verwendete Beispieldatei hat den Namen dummy.txt. Sie finden die Datei hier . Ich gehe davon aus, dass sich die Datei im selben Verzeichnis wie der Code befindet (Sie können fpath ändern, um den richtigen Dateinamen und den richtigen Ordnerpfad anzugeben.) 

In den beiden unten genannten Beispielen wird die gewünschte Liste von lst angegeben.

1.> Erste Methode:

fpath = 'dummy.txt'
with open(fpath, "r") as f: lst = [line.rstrip('\n \t') for line in f]

print lst
>>>['THIS IS LINE1.', 'THIS IS LINE2.', 'THIS IS LINE3.', 'THIS IS LINE4.']

2.> In der second-Methode können Sie - csv.reader module aus der Python Standard Library verwenden:

import csv
fpath = 'dummy.txt'
with open(fpath) as csv_file:
    csv_reader = csv.reader(csv_file, delimiter='   ')
    lst = [row[0] for row in csv_reader] 

print lst
>>>['THIS IS LINE1.', 'THIS IS LINE2.', 'THIS IS LINE3.', 'THIS IS LINE4.']

Sie können eine der beiden Methoden verwenden. Die Zeit für die Erstellung von lst ist bei beiden Methoden nahezu gleich.

1

Ich benutze gerne folgendes. Lesen Sie sofort die Zeilen.

contents = []
for line in open(filepath, 'r').readlines():
    contents.append(line.strip())

Oder mit Listenverständnis:

contents = [line.strip() for line in open(filepath, 'r').readlines()]
1
Daniel

Befehlszeilenversion

#!/bin/python3
import os
import sys
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
filename = dname + sys.argv[1]
arr = open(filename).read().split("\n") 
print(arr)

Laufen mit:

python3 somefile.py input_file_name.txt
1
jasonleonhard

Falls das Dokument auch leere Zeilen enthält, lese ich den Inhalt gerne ein und leite ihn durch filter, um leere String-Elemente zu vermeiden

with open(myFile, "r") as f:
    excludeFileContent = list(filter(None, f.read().splitlines()))
0
jeanggi90