Як я читаю кожен рядок файлу в Python і зберігаю кожний рядок як елемент у списку?
Я хочу прочитати файл за рядком і додати кожен рядок до кінця списку.
Як я читаю кожен рядок файлу в Python і зберігаю кожний рядок як елемент у списку?
Я хочу прочитати файл за рядком і додати кожен рядок до кінця списку.
Відповіді:
with open(filename) 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]
readlines()
не дуже ефективно, оскільки це може призвести до пам'яті MemoryError . У цьому випадку краще перебрати файл, використовуючи for line in f:
та працюючи з кожною line
змінною.
.rstrip()
буде працювати трохи швидше, якщо ви знімете пробіли з кінців рядків.
with open(filename) as f: content = [i.strip() for i in f.readlines()]
Див. Введення та вихід :
with open('filename') as f:
lines = f.readlines()
або із зачисткою символу нового рядка:
with open('filename') as f:
lines = [line.rstrip() for line in f]
f.read().splitlines()
, що видаляє нові рядки
for line in open(filename)
безпечною? Тобто, чи буде файл автоматично закритий?
lines = [x.rstrip('\n') for x in open('data\hsf.txt','r')]
Якщо я пишу так, як я можу закрити файл після читання?
open
без менеджера контексту (або якогось іншого гарантованого способу його закрити), це насправді не один із таких випадків - коли об'єкт не має більше посилань до нього буде зібрано сміття та закритий файл, що має відбутися негайно після помилки чи ні, коли розуміння списку буде виконано обробкою.
Це більш явно, ніж потрібно, але робить те, що ви хочете.
with open("file.txt") as file_in:
lines = []
for line in file_in:
lines.append(line)
array
, але можуть бути й інші обставини). Звичайно, для великих файлів такий підхід може полегшити проблеми.
Це дасть "масив" рядків з файлу.
lines = tuple(open(filename, 'r'))
open
повертає файл, який можна повторити. Коли ви повторюєте файл, ви отримуєте рядки з цього файлу. tuple
може взяти ітератор і створити екземпляр кортежу для нього від ітератора, який ви йому надаєте. lines
- кортеж, створений із рядків файлу.
lines = open(filename).read().split('\n')
натомість @MarshallFarrier .
lines = open(filename).read().splitlines()
трохи чистішим, і я вважаю, що він також краще обробляє закінчення рядків DOS.
list
займає приблизно 13,22% більше місця, ніж a tuple
. Результати приходять from sys import getsizeof as g; i = [None] * 1000; round((g(list(i)) / g(tuple(i)) - 1) * 100, 2)
. Створення tuple
займе приблизно 4,17% більше часу, ніж створення list
(зі стандартним відхиленням 0,16%). Результати приходять від запуску from timeit import timeit as t; round((t('tuple(i)', 'i = [None] * 1000') / t('list(i)', 'i = [None] * 1000') - 1) * 100, 2)
30 разів. Моє рішення надає перевагу простору над швидкістю, коли потреба у незмінності невідома.
Якщо ви хочете \n
включити:
with open(fname) as f:
content = f.readlines()
Якщо ви не хочете \n
включити:
with open(fname) as f:
content = f.read().splitlines()
Відповідно до методів файлових об’єктів Python , найпростіший спосіб перетворення текстового файлу в a list
:
with open('file.txt') as f:
my_list = list(f)
Якщо вам просто потрібно перебрати рядки текстових файлів, ви можете використовувати:
with open('file.txt') as f:
for line in f:
...
Стара відповідь:
Використання with
та readlines()
:
with open('file.txt') as f:
lines = f.readlines()
Якщо ви не переймаєтесь закриттям файлу, цей одноклапник працює:
lines = open('file.txt').readlines()
Традиційний спосіб:
f = open('file.txt') # Open file on read mode
lines = f.read().split("\n") # Create a list containing all lines
f.close() # Close file
Ви можете просто зробити наступне, як було запропоновано:
with open('/your/path/file') as f:
my_lines = f.readlines()
Зауважте, що у цього підходу є 2 мінуси:
1) Ви зберігаєте всі рядки в пам'яті. У загальному випадку це дуже погана ідея. Файл може бути дуже великим, і у вас може не вистачити пам'яті. Навіть якщо він не великий, це просто марно пам'ять.
2) Це не дозволяє обробляти кожен рядок під час їх читання. Тож якщо ви обробляєте свої лінії після цього, це не ефективно (потрібно два проходи, а не один).
Кращим підходом до загального випадку буде такий:
with open('/your/path/file') as f:
for line in f:
process(line)
Де ви визначаєте свою функцію процесу будь-яким способом. Наприклад:
def process(line):
if 'save the world' in line.lower():
superman.save_the_world()
(Реалізація Superman
класу залишається для вас вправою).
Це буде добре працювати для будь-якого розміру файлу, і ви перейдете через файл лише за 1 прохід. Як правило, це працює загальний аналізатор.
open('file_path', 'r+')
Дані в список
Припустимо, що у нас є текстовий файл з нашими даними, як у наступних рядках,
Вміст текстового файлу:
line 1
line 2
line 3
python
і в перекладачі написати:Сценарій Python:
>>> with open("myfile.txt", encoding="utf-8") as file:
... x = [l.strip() for l in file]
>>> x
['line 1','line 2','line 3']
Використання додавання:
x = []
with open("myfile.txt") as file:
for l in file:
x.append(l.strip())
Або:
>>> x = open("myfile.txt").read().splitlines()
>>> x
['line 1', 'line 2', 'line 3']
Або:
>>> x = open("myfile.txt").readlines()
>>> x
['linea 1\n', 'line 2\n', 'line 3\n']
Або:
>>> 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)
encoding="utf-8"
потрібно?
read().splitlines()
вам надає Python: це просто readlines()
(що, мабуть, швидше, оскільки він менш марнотратний).
Щоб прочитати файл у списку, потрібно виконати три дії:
На щастя, Python дуже легко робить це, тому найкоротший спосіб прочитати файл у список:
lst = list(open(filename))
Однак я додам ще кілька пояснень.
Я припускаю, що ви хочете відкрити певний файл і не маєте справу безпосередньо з файловою ручкою (або з файлоподібною ручкою). Найбільш часто використовувана функція для відкриття файлу в Python - open
це один обов’язковий аргумент та два необов'язкові в Python 2.7:
Ім'я файлу має бути рядком, який представляє шлях до файлу . Наприклад:
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)
Зверніть увагу, що розширення файлу потрібно вказати. Це особливо важливо для користувачів Windows , так як розширення файлів , як .txt
і .doc
т.д. приховані за замовчуванням при перегляді в провіднику.
Другий аргумент - mode
це, r
за замовчуванням означає «лише для читання». Це саме те, що вам потрібно у вашому випадку.
Але у випадку, якщо ви дійсно хочете створити файл та / або записати у файл, тут вам знадобиться інший аргумент. Якщо ви хочете огляд, є чудова відповідь .
Для читання файлу ви можете опустити mode
або передати його явно:
open(filename)
open(filename, 'r')
Обидва відкриють файл у режимі лише для читання. Якщо ви хочете читати у двійковому файлі в Windows, вам потрібно скористатися режимом rb
:
open(filename, 'rb')
На інших платформах 'b'
(двійковий режим) просто ігнорується.
Тепер, коли я показав, як до open
файлу, давайте поговоримо про те, що вам завжди потрібно close
знову. В іншому випадку він буде зберігати відкриту ручку файлу до файлу до тих пір, поки процес не завершиться (або Python приховає файлову ручку).
Хоча ви могли використовувати:
f = open(filename)
# ... do stuff with f
f.close()
Це не вдасться закрити файл, коли щось середнє open
і close
кидає виняток. Ви можете уникнути цього, використовуючи try
та finally
:
f = open(filename)
# nothing in between!
try:
# do stuff with f
finally:
f.close()
Однак Python пропонує менеджери контексту, які мають гарніший синтаксис (але open
він майже ідентичний вище try
та finally
вище):
with open(filename) as f:
# do stuff with f
# The file is always closed after the with-scope ends.
Останній підхід - рекомендований підхід до відкриття файлу в Python!
Гаразд, ви відкрили файл, тепер як його читати?
open
Функція повертає file
об'єкт , і він підтримує протокол ітерації пітонів. Кожна ітерація надасть вам рядки:
with open(filename) as f:
for line in f:
print(line)
Це надрукує кожен рядок файлу. Зауважте, що кожен рядок буде містити символ нового рядка \n
в кінці (можливо, ви захочете перевірити, чи ваш Python побудований із підтримкою універсальної лінії для нових рядків - інакше ви також можете мати \r\n
в Windows чи \r
на Mac як нові рядки). Якщо ви не хочете, ви можете просто видалити останній символ (або два останні символи в Windows):
with open(filename) as f:
for line in f:
print(line[:-1])
Але в останньому рядку необов’язково є зворотний новий рядок, тому не слід його використовувати. Можна було б перевірити, чи закінчується він останнім рядком, і якщо так, видалити його:
with open(filename) as f:
for line in f:
if line.endswith('\n'):
line = line[:-1]
print(line)
Але ви можете просто видалити всі пробіли (включаючи \n
символ) з кінця рядка , це також видалить усі інші пробіли білого простору, тому вам слід бути обережними, якщо вони важливі:
with open(filename) as f:
for line in f:
print(f.rstrip())
Однак якщо рядки закінчуються \r\n
("нові рядки" для Windows), які .rstrip()
також подбають про \r
!
Тепер, коли ви знаєте, як відкрити файл і прочитати його, настав час зберігати вміст у списку. Найпростішим варіантом буде використання list
функції:
with open(filename) as f:
lst = list(f)
У випадку, якщо ви хочете зняти нові рядки, ви можете замість цього використати розуміння списку:
with open(filename) as f:
lst = [line.rstrip() for line in f]
Або ще простіше: .readlines()
метод file
об'єкта за замовчуванням повертає a list
рядків:
with open(filename) as f:
lst = f.readlines()
Сюди також будуть входити символи нового рядка, якщо ви їх не хочете, я рекомендую такий [line.rstrip() for line in f]
підхід, оскільки це дозволяє уникнути збереження в списку двох списків, що містять усі рядки.
Існує додаткова опція для отримання потрібного результату, проте це досить "неоптимально": read
повний файл у рядку, а потім розділений на нові рядки:
with open(filename) as f:
lst = f.read().split('\n')
або:
with open(filename) as f:
lst = f.read().splitlines()
Вони доглядають за новими рядками автоматично, оскільки split
символ не включений. Однак вони не ідеальні, оскільки ви зберігаєте файл як рядок і як список рядків у пам'яті!
with open(...) as f
під час відкриття файлів, оскільки вам не потрібно дбати про закриття файлу самостійно, і він закриває файл, навіть якщо трапляється якийсь виняток.file
Об'єкти підтримують протокол ітерації, тому читання файлів по черзі є простим, як і for line in the_file_object:
.readlines()
але якщо ви хочете обробити рядки перед тим, як зберігати їх у списку, я б рекомендував просте розуміння списку.Чистий і піфонічний спосіб читання рядків файлу до списку
Перш за все, вам слід зосередитись на тому, щоб відкрити файл та прочитати його вміст ефективно та пітонічно. Ось приклад того, як я особисто НЕ віддаю перевагу:
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.
Натомість я віддаю перевагу наведеному нижче методу відкриття файлів як для читання, так і для запису, оскільки він дуже чистий і не потребує додаткового кроку закриття файлу після того, як ви закінчите його використання. У нижченаведеному твердженні ми відкриваємо файл для читання і присвоюємо йому змінну 'infile'. Після завершення запуску коду в цій заяві файл автоматично закриється.
# Open the file for reading.
with open('my_file.txt', 'r') as infile:
data = infile.read() # Read the contents of the file into memory.
Тепер нам потрібно зосередитись на включенні цих даних до списку Python, оскільки вони є ітерабельними, ефективними та гнучкими. У вашому випадку бажаною метою є виведення кожного рядка текстового файлу в окремий елемент. Для цього ми будемо використовувати метод splitlines () наступним чином:
# Return a list of the lines, breaking at line boundaries.
my_list = data.splitlines()
Кінцевий продукт:
# 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()
Тестування нашого коду:
A fost odatã ca-n povesti,
A fost ca niciodatã,
Din rude mãri împãrãtesti,
O prea frumoasã fatã.
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]
['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ã.
Введений в Python 3.4, pathlib
має дійсно зручний метод для читання тексту з файлів, як показано нижче:
from pathlib import Path
p = Path('my_text_file')
lines = p.read_text().splitlines()
( splitlines
Виклик - це те, що перетворює його з рядка, що містить весь вміст файла, до списку рядків у файлі).
pathlib
в ньому багато зручних зручностей. read_text
приємно і стисло, і вам не доведеться турбуватися про відкриття та закриття файлу. Якщо все, що вам потрібно зробити з файлом, це прочитати все за один раз, це хороший вибір.
Ось ще один варіант, використовуючи розуміння списку файлів;
lines = [line.rstrip() for line in open('file.txt')]
Це має бути більш ефективним способом, оскільки більша частина роботи виконується всередині інтерпретатора Python.
rstrip()
потенційно позбавляє всі пробіли, не тільки \n
; використання .rstrip('\n')
.
f = open("your_file.txt",'r')
out = f.readlines() # will append in the list out
Тепер змінною є список (масив) того, що ви хочете. Ви можете:
for line in out:
print (line)
Або:
for line in f:
print (line)
Ви отримаєте однакові результати.
Читання та запис текстових файлів за допомогою Python 2 та Python 3; він працює з 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)
Що потрібно помітити:
with
є так званим контекстним менеджером . Це гарантує, що відкритий файл знову закриється..strip()
або .rstrip()
не зможуть відтворити, lines
оскільки вони також знімають простір.Загальні закінчення файлів
.txt
Більш вдосконалене написання / читання файлів
Для вашої заявки може бути важливим наступне:
Дивіться також: Порівняння форматів серіалізації даних
Якщо ви шукаєте спосіб створення файлів конфігурації, ви можете прочитати мою коротку статтю Конфігураційні файли в Python .
Інший варіант numpy.genfromtxt
, наприклад:
import numpy as np
data = np.genfromtxt("yourfile.dat",delimiter="\n")
Це зробить data
масив NumPy з такою ж кількістю рядків у вашому файлі.
Якщо ви хочете прочитати файл з командного рядка або з stdin, ви також можете використовувати fileinput
модуль:
# reader.py
import fileinput
content = []
for line in fileinput.input():
content.append(line.strip())
fileinput.close()
Передайте йому файли так:
$ python reader.py textfile.txt
Детальніше читайте тут: http://docs.python.org/2/library/fileinput.html
Найпростіший спосіб це зробити
Простий спосіб - це:
В одному рядку це дасть:
lines = open('C:/path/file.txt').read().splitlines()
Однак це досить неефективний спосіб, оскільки це збереже 2 версії вмісту в пам'яті (мабуть, це не велика проблема для невеликих файлів, але все ж). [Спасибі Марку Амерді].
Є два простіших способи:
lines = list(open('C:/path/file.txt'))
# ... or if you want to have a list without EOL characters
lines = [l.rstrip() for l in open('C:/path/file.txt')]
pathlib
для створення шляху для вашого файлу, який ви можете використовувати для інших операцій у вашій програмі:from pathlib import Path
file_path = Path("C:/path/file.txt")
lines = file_path.read_text().split_lines()
# ... or ...
lines = [l.rstrip() for l in file_path.open()]
.read().splitlines()
не є "простішим" ніж просто дзвінок .readlines()
. Для іншого - це неефективна пам'ять; вам непотрібно зберігати відразу дві версії вмісту файлу (один рядок, який повертається .read()
, і список рядків, що повертаються splitlines()
) відразу в пам'яті.
Просто використовуйте функції splitlines (). Ось приклад.
inp = "file.txt"
data = open(inp)
dat = data.read()
lst = dat.splitlines()
print lst
# print(lst) # for python 3
У висновку у вас буде список рядків.
.readlines()
. Це ставить дві копії вмісту файлу одразу в пам’ять (одна - як один величезний рядок, друга - як список рядків).
Якщо ви хочете зіткнутися з дуже великим / величезним файлом і хочете прочитати швидше (уявіть, ви перебуваєте у змаганні з кодування Topcoder / Hackerrank), ви можете прочитати значно більший відрізок рядків у буфер пам'яті, а не ніж просто повторіть рядок за рядком на рівні файлу.
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)
process(line)
- це функція, яку потрібно реалізувати для обробки даних. наприклад, замість цього рядка, якщо ви використовуєте print(line)
, він буде надрукувати кожен рядок із рядка_буфера.
lines = list(open('filename'))
або
lines = tuple(open('filename'))
або
lines = set(open('filename'))
У випадку з set
, ми повинні пам’ятати, що в нас немає збереженого порядку рядків і позбутися дублюваних рядків.
Оскільки ви не викликаєте
.close
об’єкт файлу і не використовуєтеwith
оператор, у деяких реалізаціях Python файл може не закритися після читання, і ваш процес витіче з відкритої ручки файлу .У CPython (звичайна реалізація Python, якою користується більшість людей), це не проблема, оскільки об’єкт файлу негайно отримає зібраний сміття, і це закриє файл, але тим не менш, як правило, найкращою практикою є щось подібне :
with open('filename') as f: lines = list(f)
щоб закрити файл незалежно від того, яку програму Python ви використовуєте.
.close
об’єкт файлу і не використовуєте with
оператор, у деяких реалізаціях Python файл може не закритися після читання, і ваш процес витіче з відкритої ручки файлу. У CPython (звичайна реалізація Python, якою користується більшість людей), це не проблема, оскільки об’єкт файлу негайно отримає зібраний сміття, і це закриє файл, але, тим не менш, загалом найкращою практикою вважається робити щось на кшталт with open('filename') as f: lines = list(f)
того файл закривається незалежно від того, яку реалізацію Python ви використовуєте.
Використовуй це:
import pandas as pd
data = pd.read_csv(filename) # You can also add parameters such as header, sep, etc.
array = data.values
data
є типом фрейму даних і використовує значення для отримання ndarray. Ви також можете отримати список, скориставшись array.tolist()
.
pandas.read_csv()
для читання CSV- даних, як це доречно тут?
За допомогою a filename
, обробляючи файл з Path(filename)
об'єкта або безпосередньо open(filename) as f
, виконайте одну з таких дій:
list(fileinput.input(filename))
with path.open() as f
, дзвінокf.readlines()
list(f)
path.read_text().splitlines()
path.read_text().splitlines(keepends=True)
fileinput.input
або f
і list.append
кожен рядок по одному за разf
до зв'язаного list.extend
методуf
в розумінні спискуЯ пояснюю приклад використання для кожного нижче.
Як я можу прочитати файл у рядку в Python?
Це відмінне запитання. Спочатку створимо кілька прикладних даних:
from pathlib import Path
Path('filename').write_text('foo\nbar\nbaz')
Файлові об’єкти - це ліниві ітератори, тому просто перебирайте на ньому.
filename = 'filename'
with open(filename) as f:
for line in f:
line # do something with the line
Крім того, якщо у вас є кілька файлів, використовуйте fileinput.input
інший лінивий ітератор. Маючи лише один файл:
import fileinput
for line in fileinput.input(filename):
line # process the line
або для декількох файлів передайте йому список імен файлів:
for line in fileinput.input([filename]*2):
line # process the line
Знову f
і fileinput.input
вище обох є / повертаються ліниві ітератори. Ви можете використовувати ітератор лише один раз, так що для надання функціонального коду, уникаючи багатослівності, я використовую трохи більш короткий текст, fileinput.input(filename)
де зараз.
Як в Python я можу прочитати файл рядок за рядком у списку?
Ах, але ви хочете це в списку чомусь? Я б уникну цього, якщо можливо. Але якщо ви наполягаєте ... просто передати результат fileinput.input(filename)
в list
:
list(fileinput.input(filename))
Інша пряма відповідь - дзвінок f.readlines
, який повертає вміст файлу (до необов'язкової hint
кількості символів, щоб ви могли поділити це на декілька списків таким чином).
Ви можете дістатися до цього файлового об’єкта двома способами. Один із способів - передати ім'я файлу open
вбудованому:
filename = 'filename'
with open(filename) as f:
f.readlines()
або використовуючи новий об'єкт Path з pathlib
модуля (який мені вже дуже подобається, і я буду використовувати тут):
from pathlib import Path
path = Path(filename)
with path.open() as f:
f.readlines()
list
також буде споживати ітератор файлів і повертати список - також досить прямий метод:
with path.open() as f:
list(f)
Якщо ви не заперечуєте читати весь текст у пам'яті як окремий рядок перед тим, як розділити його, ви можете зробити це як однолінійка з Path
об'єктом та splitlines()
методом рядка. За замовчуванням splitlines
видаляє нові рядки:
path.read_text().splitlines()
Якщо ви хочете зберегти нові рядки, пройдіть keepends=True
:
path.read_text().splitlines(keepends=True)
Я хочу прочитати файл за рядком і додати кожен рядок до кінця списку.
Зараз це запитувати трохи нерозумно, враховуючи, що ми легко продемонстрували кінцевий результат кількома методами. Але вам може знадобитися відфільтрувати або оперувати лініями під час створення списку, тому давайте озвучить цей запит.
Використання list.append
дозволить вам фільтрувати або оперувати в кожному рядку, перш ніж додавати його:
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
Або ще ідіоматично, ми можемо замість цього використати розуміння списку та, за бажанням, картографувати та фільтрувати всередині нього:
[line for line in fileinput.input(filename)]
Або ще прямо, щоб закрити коло, просто перенесіть його до списку, щоб створити новий список безпосередньо, не оперуючи рядками:
list(fileinput.input(filename))
Ви бачили багато способів отримання рядків з файлу до списку, але я рекомендую вам уникати матеріалізації великої кількості даних у список, а замість цього використати ледачу ітерацію Python для обробки даних, якщо це можливо.
Тобто віддайте перевагу fileinput.input
або with path.open() as f
.
Ви також можете використовувати команду loadtxt в NumPy. Це перевіряє менше умов, ніж genfromtxt, тому може бути швидшим.
import numpy
data = numpy.loadtxt(filename, delimiter="\n")
Мені подобається використовувати наступне. Читання рядків негайно.
contents = []
for line in open(filepath, 'r').readlines():
contents.append(line.strip())
Або використовуючи розуміння списку:
contents = [line.strip() for line in open(filepath, 'r').readlines()]
readlines()
, яка навіть несе штрафну пам'ять. Ви можете просто його видалити, оскільки повторення над (текстовим) файлом дає по черзі кожен рядок.
with
оператор, щоб відкрити (та неявно закрити) файл.
Я б спробував один із наведених нижче методів. Прикладний файл, який я використовую, має ім'я dummy.txt
. Ви можете знайти файл тут . Я припускаю, що файл знаходиться в тому ж каталозі, що і код (ви можете змінити, fpath
щоб включити власне ім'я файлу та шлях до папки.)
В обох наведених нижче прикладах наведений список, який ви хочете lst
.
1.> Перший метод :
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.> У другому методі можна використовувати модуль csv.reader з стандартної бібліотеки Python :
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.']
Можна скористатися будь-яким із двох методів. Час, необхідний для створення, lst
у двох методів майже дорівнює.
delimiter=' '
аргумент?
Ось бібліотечний клас бібліотеки Python (3), який я використовую для спрощення вводу / виводу файлів:
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
Потім ви б використали FileIO.lines
функцію, наприклад:
file_ext_lines = FileIO.lines("./path/to/file.ext"):
for i, line in enumerate(file_ext_lines):
print("Line {}: {}".format(i + 1, line))
Пам'ятайте, що параметри mode
( "r"
за замовчуванням) та filter_fn
(перевірки порожніх рядків за замовчуванням) параметри необов’язкові.
Ви навіть можете видалити read
, write
і delete
методи, і просто залишити FileIO.lines
, або навіть перетворити його в окремий метод, який називається read_lines
.
lines = FileIO.lines(path)
самому ділі досить простіше , ніж with open(path) as f: lines = f.readlines()
виправдати існування цього помічника в? Ви заощаджуєте, наприклад, 17 символів на дзвінок. (І більшу частину часу, з міркувань продуктивності та пам’яті, ви хочете перенести цикл на файл-об’єкт безпосередньо, а не читати його рядки у списку, так що ви навіть не хочете цим часто користуватися!) часто прихильник створення невеликих функцій утиліти, але мені здається, що це просто зайве створення нового способу написати щось, що вже є коротким і простим за допомогою стандартної бібліотеки.
#!/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)
python3 somefile.py input_file_name.txt
file.readlines()
вfor
-loop, достатньо самого файлового об’єкта:lines = [line.rstrip('\n') for line in file]