Kaip skaityti failą pagal sąrašo eilutę?

Kaip skaityti kiekvieną Python failo eilutę ir išsaugoti kiekvieną eilutę kaip elementą sąraše?

Noriu perskaityti failo eilutę pagal eilutę ir pridėti kiekvieną eilutę prie sąrašo pabaigos.

1901 m
19 июля '10 в 1:25 2010-07-19 01:25 Julie Raswick paprašė liepos 19 d. 10:25 1:25 2010-07-19 01:25
@ 39 atsakymų
  • 1
  • 2
 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] 
1843 m
19 июля '10 в 1:28 2010-07-19 01:28 atsakymas duotas „ SilentGhost“ liepos 19 d. 10 val. 1:28 2010-07-19 01:28

Žr. Įvestį ir „Ouput“ :

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

arba pašalinant naują eilutę:

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

Redaktoriaus pastaba: ši šaltinio erdvės šalinimo komanda, line.strip() , kaip numato Janus Troelsen komentaras, pašalins visas pirmaujančias ir galines tarpas, ne tik \n .

843
19 июля '10 в 1:28 2010-07-19 01:28 atsakymą pateikė Felixas Klingas liepos 10 d., 10:28, 2010-07-19 01:28

Tai labiau akivaizdu nei būtina, bet tai, ko norite.

 with open("file.txt", "r") as ins: array = [] for line in ins: array.append(line) 
449
19 июля '10 в 1:27 2010-07-19 01:27 atsakymą davė Robertas liepos 19 d. 10 val. 1:27 2010-07-19 01:27

Tai sukels eilutės „masyvą“ iš failo.

 lines = tuple(open(filename, 'r')) 
229
19 июля '10 в 1:27 2010-07-19 01:27 Atsakymą pateikė „ Noctis Skytower “ liepos 10 d. , 10:27, 2010-07-19 01:27

Jei norite įjungti:

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

Jei nenorite įtraukti:

 with open(fname) as f: content = f.read().splitlines() 
161
02 марта '14 в 7:22 2014-03-02 07:22 atsakymą pateikė Eneko Alonso kovo 2 d. 14 d., 7:22 2014-03-02 07:22

Galite pasiūlyti šiuos veiksmus:

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

Atkreipkite dėmesį, kad šis metodas turi 2 trūkumus:

1) Išsaugojote visas atminties eilutes. Apskritai tai yra labai bloga idėja. Failas gali būti labai didelis, todėl galite išnaudoti atmintį. Net jei jis yra mažas, tai tik atmintis.

2) Jis neleidžia kiekvienai eilutei apdoroti, kai jas skaitote. Todėl, jei po to apdorosite savo linijas, tai nėra veiksminga (tai trunka du, o ne vieną).

Geriausias požiūris į bendrą atvejį būtų toks:

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

Kur bet kokiu būdu apibrėžiate savo proceso funkciją. Pavyzdžiui:

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

( Superman klasės įgyvendinimas išlieka jums naudinga).

Jis veiks gerai bet kokiam failo dydžiui, ir jūs per savo failą pereisite per vieną leidimą. Paprastai veiks bendri analizatoriai.

118
25 февр. „ DevShark“ atsakymas, vasario 25 d 2016-02-25 12:13 '16 at 12:13 2016-02-25 12:13

Jei nereikia uždaryti failo, tai veikia viena eilutė:

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

Tradicinis būdas:

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

Naudojimas with ir readlines() (rekomenduojama) :

 with open('file.txt') as fp: lines = fp.readlines() 
82
20 апр. Pedro Lobito atsakymas, pateiktas balandžio 20 d 2015-04-20 08:53 '15, 8:53 2015-04-20 08:53

Duomenys, į kuriuos reikia įtraukti sąrašą

Tarkime, mes turime tekstinį failą su mūsų duomenimis, kaip ir šiose eilutėse:

Teksto turinys:

 line 1 line 2 line 3 
  • Atidarykite cmd tame pačiame kataloge (dešiniuoju pelės mygtuku spustelėkite ir pasirinkite cmd arba PowerShell)
  • Vykdykite „ python ir vertėjo raštu:

„Python Script“

50
26 апр. Giovanni Gianni atsakymas, balandžio 26 d 2017-04-26 07:57 '17 7:57 2017-04-26 07:57

Tai turėtų apimti atvirą komandą.

 array = [] with open("file.txt", "r") as f: for line in f: array.append(line) 
44
28 окт. atsakymas, kurį pateikė cevaris 28 spalis 2013-10-28 18:40 '13, 6:40 pm 2013-10-28 18:40

„Clean“ ir „Pythonic“ būdas skaityti sąrašo failų eilutes


Pirmiausia turėtumėte sutelkti dėmesį į failo atidarymą ir jo turinio efektyvų ir pythoninį skaitymą. Štai pavyzdys, kaip aš asmeniškai nenoriu:

 # Open the file for reading. with open('my_file.txt', 'r') as infile: data = infile.read() # Read the contents of the file into memory. 

Dabar turime sutelkti dėmesį į šių duomenų perkėlimą į „Python“ sąrašą , nes jie yra pakartotiniai, efektyvūs ir lankstūs. Jūsų atveju pageidaujamas tikslas - įdėti kiekvieną teksto failo eilutę į atskirą elementą. Norėdami tai padaryti, naudosime „ splitlines“ () metodą taip:

 # 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() 

Mūsų kodo testavimas:

  • Teksto failo turinys:
  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] 
  • Išvada (skiriasi dėl Unicode simbolių):
36
20 дек. Johnny atsakymas 20 d 2014-12-20 21:31 '14, 21:31 2014-12-20 21:31

Jei norite skaityti failą sąraše, turite atlikti tris dalykus:

  • Atidaryti failą
  • Perskaitykite failą
  • Išsaugokite turinį kaip sąrašą

Laimei, Python supaprastina šias užduotis, todėl trumpiausias būdas skaityti failą sąraše yra:

 lst = list(open(filename)) 

Tačiau pridėsiu dar keletą paaiškinimų.

Atidaryti failą

Manau, kad norite atidaryti konkretų failą, ir jūs nesusiję tiesiogiai su failų deskriptoriu (arba failo tipo deskriptoriu). Dažniausiai naudojama „Python“ failo atidarymo funkcija yra vienas reikalingas argumentas ir du neprivalomi failai „Python 2.7“:

  • Failo pavadinimas
  • Režimas
  • Buferavimas (šiame atsakyme ignoruosiu šį argumentą)

Failo pavadinimas turi būti eilutė, vaizduojanti failo kelią. Pavyzdžiui:

 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) 

Atminkite, kad turite nurodyti failo plėtinį. Tai ypač svarbu „Windows“ vartotojams, nes tokie failai kaip .txt arba .doc ir tt Pagal nutylėjimą paslėpta naršyklėje „Explorer“

Antrasis argumentas yra mode , jis yra r pagal nutylėjimą, o tai reiškia tik skaitymą. Būtent tai jums reikia jūsų atveju.

Bet jei tikrai norite sukurti failą ir (arba) rašyti į failą, jums reikės kito argumento. Jei norite peržiūrėti, yra puikus atsakymas .

Jei norite perskaityti failą, galite praleisti mode arba aiškiai jį perduoti:

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

Abu failai bus atidaryti tik skaitymo režimu. Jei norite skaityti dvejetainį failą sistemoje „Windows“, turite naudoti rb režimą:

 open(filename, 'rb') 

Kitose platformose 'b' (dvejetainis režimas) tiesiog ignoruojamas.


Dabar, kai parodysiu, kaip open failą, pasakykite man, kad jums visada reikia jį vėl close . Priešingu atveju, jis išsaugos failo atvirojo failo deskriptorių tol, kol procesas baigsis (arba Python atstato deskriptoriaus failą).

Nors galite naudoti:

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

Failo nebus galima uždaryti, jei kažkas tarp open ir close išimčių. Tai galite išvengti naudodami try ir finally :

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

Tačiau „Python“ suteikia konteksto valdytojui, turinčiam gražesnę sintaksę (bet open beveik identiška try ir, finally , aukščiau):

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

Paskutinis požiūris yra rekomenduojamas būdas atidaryti failą „Python“!

Skaitymo failas

Na, jūs atidarėte failą, dabar kaip jį skaityti?

open funkcija grąžina file objektą ir palaiko Pythons iteracijos protokolą. Kiekviena iteracija suteiks jums eilutę:

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

Tai spausdins kiekvieną failo eilutę. Tačiau atkreipkite dėmesį, kad kiekvienoje eilutėje pabaigoje bus nauja eilutė (galite patikrinti, ar jūsų „Python“ sukurta naudojant universalią „lineline“ paramą), kitaip jūs taip pat galite turėti „Windows“ arba „Mac“ operacinėje sistemoje „Mac“ kaip naujos eilutės) Jei nenorite, kad tiesiog ištrintumėte paskutinį simbolį (arba paskutinius du simbolius „Windows“):

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

Tačiau paskutinė eilutė nebūtinai turi naują eilutę, todėl ji neturėtų būti naudojama. Galite patikrinti, ar jis baigiasi nauja linija, ir, jei reikia, ją pašalinti:

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

Bet iš eilės galėtumėte tiesiog pašalinti visas erdves (įskaitant simbolį), taip pat pašalinsite visas kitas galines vietas, todėl turėtumėte būti atsargūs, jei jie yra svarbūs:

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

Tačiau, jei linijos baigsis \r\n (Windows " .rstrip() "), kad .rstrip() pat rūpinsis \r !

Išsaugokite turinį kaip sąrašą

Dabar, kai žinote, kaip atidaryti failą ir jį perskaityti, turinį reikia išsaugoti sąraše. Lengviausias būdas yra naudoti list funkciją:

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

Jei norite atskirti galutinio naujo eilutės simbolius, galite naudoti sąrašo suvokimą:

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

Arba dar paprastesnis: file objekto .readlines() metodas pagal nutylėjimą grąžina eilių list :

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

Tai taip pat apims naujus eilutės simbolius, jei nenorite jų, rekomenduoju naudoti [line.rstrip() for line in f] metodą, nes jis neleidžia saugoti dviejų sąrašų, kuriuose yra visos atminties eilutės.

Yra papildoma parinktis norimam rezultatui gauti, tačiau tai yra „suboptimalus“: read visą failą eilutėje ir padalinkite jį į eilutes:

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

arba

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

Jie automatiškai rūpinasi nutraukiančio eilutės simboliais, nes split simbolis nėra įtrauktas. Tačiau jie nėra tobuli, nes saugote failą kaip eilutę ir kaip atminties styginių sąrašą!

Santrauka

  • Atidarydami failus, naudokite with open(...) as f , nes jums nereikia nerimauti dėl failo uždarymo ir uždaro failą, net jei atsiranda išimtis.
  • file objektai palaiko iteracijos protokolą, todėl failo skaitymas pagal eilutę yra toks pat lengvas, kaip for line in the_file_object:
  • Visada peržiūrėkite turimų funkcijų / klasių dokumentus. Daugeliu atvejų idealiai atitinka užduotį arba bent vieną ar du gerus. Akivaizdus pasirinkimas šiuo atveju būtų readlines() bet jei norite apdoroti eilutes prieš juos saugant į sąrašą, rekomenduoju paprastą sąrašo supratimą.
31
17 янв. Atsakymą pateikė MSeifert 17 sausis 2018-01-17 01:33 '18 at 1:33 2018-01-17 01:33

Norėčiau tai padaryti taip.

 lines = [] with open("myfile.txt") as f: for line in f: lines.append(line) 
28
09 дек. atsakymas pateiktas vartotojo3394040 09 dec. 2016-12-09 21:43 '16 at 21:43 2016-12-09 21:43

Čia yra dar viena parinktis, naudojant failų sąrašus;

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

Tai turėtų būti veiksmingesnis būdas, nes didžiąją dalį darbo atliekama „Python“ vertėjo žodžiu.

23
27 мая '14 в 15:21 2014-05-27 15:21 atsakymą pateikė vartotojo1833244 gegužės 27 d., 14 val. 15:21 2014-05-27 15:21

Kita parinktis yra numpy.genfromtxt , pavyzdžiui:

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

Tai padarys data NumPy masyvą su tiek daug linijų, kaip ir jūsų faile.

22
18 июня '13 в 13:17 2013-06-18 13:17 Atsakymas yra atomas33h birželio 13 d. 13:17, 2013-06-18 13:17

Jei norite skaityti failą iš komandų eilutės arba iš stdin, taip pat galite naudoti fileinput modulį:

 # reader.py import fileinput content = [] for line in fileinput.input(): content.append(line.strip()) fileinput.close() 

Perkelkite tokius failus:

 $ python reader.py textfile.txt 

Sužinokite daugiau čia: http://docs.python.org/2/library/fileinput.html

20
22 нояб. Atsakymas pateikiamas olilandui lapkričio 22 d. 2013-11-22 17:57 '13, 17:57, 2013-11-22 17:57

Tekstinių failų skaitymas ir rašymas naudojant „Python 2“ ir „Python 3“; jis veikia su unikodu

 #!/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) 

Ką reikėtų pažymėti:

  • yra vadinamasis konteksto valdytojas . Tai garantuoja, kad atviras failas bus vėl uždarytas.
  • Čia visi sprendimai, kurie tiesiog sudaro .strip() arba .rstrip() , negalės atkurti lines nes jie taip pat turi .rstrip() erdvę.

Bendrosios rinkmenų pabaigos

.txt

Išplėstinės skaitymo / rašymo rinkmenos

Toliau pateikti veiksmai gali būti svarbūs jūsų programai:

  • Parama kitomis programavimo kalbomis
  • Skaitymas / rašymas
  • Kompaktiškumas (failo dydis)

Taip pat žiūrėkite: Duomenų lyginamųjų formatų palyginimas

Jei ieškote būdų sukurti konfigūracijos failus, galite skaityti trumpą straipsnį „ Konfigūracijos failai Pythone“ .

16
16 янв. Atsakymas, kurį pateikė Martin Thoma , sausio 16 d 2018-01-16 22:42 '18, 10:42 pm 2018-01-16 22:42

Lengviausias būdas tai padaryti

Paprastas būdas yra:

  • Skaitykite visą failą kaip eilutę.
  • Padalinkite eilutę pagal eilutes

Vienoje eilutėje ji suteiks:

 lines = open('C:/path/file.txt').read().splitlines() 
16
06 февр. Atsakymą pateikė Jean-Francois T. 06 vasaris. 2015-02-06 06:34 '15 at 6:34 am 2015-02-06 06:34
 f = open("your_file.txt",'r') out = f.readlines() # will append in the list out 

Dabar kintamasis yra tai, ko norite. Galite:

 for line in out: print line 

arba

 for line in f: print line 

Jūs gausite tuos pačius rezultatus.

14
12 янв. Atsakymas pateikiamas moldovean 12 sausis 2014-01-12 13:58 '14, 13:58, 2014-01-12 13:58

Įdiegtas Python 3.4, pathlib yra tikrai patogus būdas skaityti tekstą iš failų, būtent:

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

( splitlines yra tai, kas paverčia ją iš eilutės, kurioje yra visas failo turinys į failų eilių sąrašą).

pathlib turi daug patogių funkcijų. read_text yra geras ir read_text , ir jums nereikia nerimauti dėl failo atidarymo ir uždarymo. Jei viskas, ką turite daryti su byla, ją perskaitykite iš karto, tai yra geras pasirinkimas.

14

Galite tiesiog atidaryti failą skaitymui naudodami:

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

Sąrašo lines bus visos jūsų eilutės kaip atskiri elementai, o jūs galite skambinti konkrečiu elementu naudodami lines["linenumber-1"] nes Python pradeda skaičiuoti nuo 0.

11
19 мая '17 в 13:50 2017-05-19 13:50 atsakymą pateikė Diksha Dhawan , gegužės 19 d. 17 d. 13:50

Jei norite susidurti su labai dideliu / didžiuliu failu ir norite greitai jį perskaityti (įsivaizduokite, kad esate „Topcoder / Hackerrank“ kodavimo konkurse), vienu metu galite perskaityti daug didesnį eilučių fragmentą, o ne tiesiog surūšiuoti per eilutę eilutė failų lygiu.

9
11 марта '17 в 11:49 2017-03-11 11:49 atsakymas pateikiamas pambda kovo 11 d., 17 val. 11:49 2017-03-11 11:49

Kiek aš žinau, Python neturi savo masyvo duomenų masyvo. Tačiau ji palaiko sąrašo duomenų struktūrą, kuri yra daug paprastesnė naudoti nei masyvas.

 array = [] #declaring a list with name '**array**' with open(PATH,'r') as reader : for line in reader : array.append(line) 
7
07 марта '16 в 9:54 2016-03-07 09:54 atsakymas duotas Strik3r 07 kovo 16 d. 9:54 2016-03-07 09:54

Naudokite:

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

data yra duomenų tipas ir naudoja ndarray vertes. Taip pat galite gauti sąrašą naudojant array.tolist() .

4
30 марта '16 в 18:50 2016-03-30 18:50 atsakymas pateikiamas „ Nulis“ kovo 30 d. 16:50 2016-03-30 18:50

Tai galite lengvai padaryti naudodami šį kodą:

 lines = open(filePath).readlines() 
4
26 июня '17 в 4:43 2017-06-26 04:43 Atsakymą pateikė Pedramas birželio 26 d. 17, 04:43 2017-06-26 04:43

Patikrinkite šį trumpą kūrinį.

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

arba

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

kreipkitės į dokumentus

3
06 нояб. atsakymas Seenivasanui, lapkričio 6 d. 2018-11-06 17:35 '18, 17:35 pm 2018-11-06 17:35

Taip pat galite naudoti komandą Loadtxt „NumPy“. Tai tikrina mažiau sąlygų nei genfromtxt, todėl jis gali būti greitesnis.

 import numpy data = numpy.loadtxt(filename, delimiter="\n") 
3
20 июля '15 в 20:33 2015-07-20 20:33 atsakymas pateikiamas asampat3090 liepos 20, 15, 20:33 2015-07-20 20:33

Planas ir santrauka

Naudodami filename , apdorokite failą iš Path(filename) objekto Path(filename) arba tiesiogiai su open(filename) as f , atlikite vieną iš šių veiksmų:

  • list(fileinput.input(filename))
  • naudojant with path.open() as f , skambinkite f.readlines()
  • list(f)
  • path.read_text().splitlines()
  • path.read_text().splitlines(keepends=True)
  • fileinput.input by fileinput.input arba f ir list.append kiekviena eilutė po vieną
  • list.extend prie susijusio list.extend metodo
  • naudokite f , kaip apibrėžta sąraše

Aš paaiškinsiu kiekvieno atvejo naudojimo atvejį.

Python programoje kaip perskaityti failą po vieną?

Tai puikus klausimas. Pirma, leiskite sukurti kai kuriuos imties duomenis:

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

Failų objektai yra tingūs iteratoriai, todėl tiesiog juos perskaičiuokite.

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

Be to, jei turite kelis failus, naudokite fileinput.input , kitą tingų iteratorių. Tik su vienu failu:

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

arba keliems failams, pateikite jam failų pavadinimų sąrašą:

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

Vėlgi, f ir fileinput.input aukščiau abu yra / grįžti tingūs iteratoriai. fileinput.input(filename) iteratorių galite naudoti tik tada, kad pateiktumėte funkcinį kodą, išvengiant verbiškumo, aš fileinput.input(filename) šiek tiek daugiau fileinput.input(filename) ir čia.

Kaip „Python“, kaip aš galiu perskaityti sąrašo failo eilutę pagal eilutes ?

O, bet ar norite, kad jis būtų sąraše dėl kokios nors priežasties? Aš tai išvengčiau, jei tai būtų įmanoma. Bet jei jūs reikalaujate ... tiesiog fileinput.input(filename) rezultatą fileinput.input(filename) į list :

 list(fileinput.input(filename)) 

Kitas tiesioginis atsakymas yra skambinti f.readlines , kuri grąžina failo turinį (iki pasirinktinio simbolių skaičiaus hint , kad galėtumėte padalyti jį į kelis sąrašus tokiu būdu).

Galite pereiti prie šio failo dviem būdais. Vienas iš būdų yra open failo pavadinimą į integruotą:

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

arba naudojant naują kelio objektą iš pathlib modulio (kuris bus labai pathlib man ir pathlib jį iš čia):

 from pathlib import Path path = Path(filename) with path.open() as f: f.readlines() 

list taip pat bus naudojamas failų iteratorius ir grąžinamas sąrašas - gana paprastas metodas:

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

Jei nenorite perskaityti viso teksto atmintyje kaip viena eilutė prieš ją skaldant, galite tai padaryti kaip vieną eilutės objektą splitlines() eilutės splitlines() Path ir splitlines() objektu.

 path.read_text().splitlines() 

Jei norite išsaugoti eilutės simbolius, eikite į keepends=True :

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

Noriu perskaityti failo eilutę pagal eilutę ir pridėti kiekvieną eilutę prie sąrašo pabaigos.

Dabar tai šiek tiek kvaila paklausti, atsižvelgiant į tai, kad mes galime lengvai parodyti galutinį rezultatą keliais būdais. Tačiau, kai sudarote savo sąrašą, jums gali tekti filtruoti arba dirbti su linijomis, todėl pateikite šį užklausos humorą.

Naudojant list.append , galėsite filtruoti arba dirbti su kiekviena eilute prieš jį pridėdami:

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

Использование list.extend было бы немного более прямым и, возможно, полезным, если у вас есть существующий список:

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