etc./StackOverFlow

파일을 한 줄씩 목록으로 읽는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2021. 12. 6. 22:01
반응형

질문자 :Julie Raswick


Python에서 파일의 모든 줄을 읽고 각 줄을 목록의 요소로 저장하려면 어떻게 해야 합니까?

파일을 한 줄씩 읽고 목록 끝에 각 줄을 추가하고 싶습니다.



이 코드는 전체 파일을 메모리로 읽고 각 줄 끝에서 모든 공백 문자(줄 바꿈 및 공백)를 제거합니다.

 with open(filename) as file: lines = file.readlines() lines = [line.rstrip() for line in lines]

큰 파일로 작업하는 경우 대신 한 줄씩 읽고 처리해야 합니다.

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

Python 3.8 이상에서는 다음과 같이 walrus 연산자 와 함께 while 루프를 사용할 수 있습니다.

 with open(filename) as file: while (line := file.readline().rstrip()): print(line)

파일로 수행하려는 작업과 인코딩 방식에 따라 액세스 모드 와 문자 인코딩을 수동으로 설정할 수도 있습니다.

 with open(filename, 'r', encoding='UTF-8') as file: while (line := file.readline().rstrip()): print(line)

SilentGhost

입력 및 출력 참조:

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

또는 개행 문자를 제거하여:

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

Felix Kling

이것은 필요 이상으로 명시적이지만 원하는 것을 수행합니다.

 with open("file.txt") as file_in: lines = [] for line in file_in: lines.append(line)

robert

이것은 파일에서 줄의 "배열"을 생성합니다.

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

open 은 반복할 수 있는 파일을 반환합니다. 파일을 반복할 때 해당 파일에서 행을 가져옵니다. tuple 은 반복자를 가져 와서 제공한 반복자에서 튜플 인스턴스를 인스턴스화할 수 있습니다. lines 은 파일의 라인에서 생성된 튜플입니다.


Noctis Skytower

\n 포함하려면 다음을 수행하십시오.

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

\n 포함하지 않으려면 다음을 수행하십시오.

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

Eneko Alonso

Python의 Methods of File Objects list 으로 변환하는 가장 간단한 방법은 다음과 같습니다.

 with open('file.txt') as f: my_list = list(f) # my_list = [x.rstrip() for x in f] # remove line breaks

텍스트 파일 행을 반복해야 하는 경우 다음을 사용할 수 있습니다.

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

이전 답변:

withreadlines() :

 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().splitlines() # List with stripped line-breaks f.close() # Close file

Pedro Lobito

제안된 대로 간단히 다음을 수행할 수 있습니다.

 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 클래스의 구현은 연습 문제로 남겨둡니다.)

이것은 모든 파일 크기에서 잘 작동하며 단 한 번의 패스로 파일을 살펴봅니다. 이것은 일반적으로 일반 파서가 작동하는 방식입니다.


DevShark

텍스트 파일 콘텐츠가 있는 경우:

 line 1 line 2 line 3

위의 txt와 동일한 디렉토리에서 이 Python 스크립트를 사용할 수 있습니다.

 >>> with open("myfile.txt", encoding="utf-8") as file: ... x = [l.rstrip("\n") 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']

또는:

 def print_output(lines_in_textfile): print("lines_in_textfile =", lines_in_textfile) y = [x.rstrip() for x in open("001.txt")] print_output(y) with open('001.txt', 'r', encoding='utf-8') as file: file = file.read().splitlines() print_output(file) with open('001.txt', 'r', encoding='utf-8') as file: file = [x.rstrip("\n") for x in file] print_output(file)

산출:

 lines_in_textfile = ['line 1', 'line 2', 'line 3'] lines_in_textfile = ['line 1', 'line 2', 'line 3'] lines_in_textfile = ['line 1', 'line 2', 'line 3']

PythonProgrammi

파일을 목록으로 읽으려면 세 가지 작업을 수행해야 합니다.

  • 파일 열기
  • 파일 읽기
  • 내용을 목록으로 저장

다행히 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)

파일 확장자를 지정해야 합니다. .txt 또는 .doc 등과 같은 파일 확장자는 탐색기에서 볼 때 기본적으로 숨겨져 있기 때문에 Windows 사용자에게 특히 중요합니다.

두 번째 인수는 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()

openclose 사이에 예외가 발생하면 파일을 닫지 못합니다. tryfinally 다음을 사용하여 이를 피할 수 있습니다.

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

그러나 Python은 더 예쁜 구문을 가진 컨텍스트 관리자를 제공합니다(그러나 open tryfinally 와 거의 동일합니다).

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

마지막 접근 방식은 Python에서 파일을 여는 데 권장되는 접근 방식입니다!

파일 읽기

자, 파일을 열었습니다. 이제 어떻게 읽을까요?

open 함수는file 객체를 반환하고 Pythons 반복 프로토콜을 지원합니다. 각 반복은 다음 행을 제공합니다.

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

그러면 파일의 각 행이 인쇄됩니다. 그러나 각 줄 \n 이 포함됩니다(파이썬이 범용 개행 지원으로 빌드되었는지 확인하고 싶을 수도 있습니다. 그렇지 않으면 Windows \r\n \r 을 개행으로 사용할 수도 있습니다) . 원하지 않는 경우 마지막 문자(또는 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 "newlines")으로 .rstrip()\r !

내용을 목록으로 저장

이제 파일을 열고 읽는 방법을 알았으므로 내용을 목록에 저장할 차례입니다. list 기능을 사용하는 것입니다.

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

후행 줄 바꿈을 제거하려는 경우 대신 목록 이해를 사용할 수 있습니다.

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

또는 더 간단합니다. 기본적으로 file .readlines() 메서드는 다음 행 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() 이지만 목록에 저장하기 전에 행을 처리하려면 간단한 목록 이해를 권장합니다.

MSeifert

파일의 줄을 목록으로 읽는 깨끗하고 Pythonic한 방법


무엇보다도 파일을 열고 효율적이고 파이썬적인 방식으로 파일 내용을 읽는 데 집중해야 합니다. 다음은 개인적으로 선호하지 않는 방식의 예입니다.

 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ã.

Johnny

Python 3.4에 도입된 pathlib 에는 다음과 같이 파일에서 텍스트를 읽는 매우 편리한 방법이 있습니다.

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

( splitlines 호출은 파일의 전체 내용을 포함하는 문자열에서 파일의 줄 목록으로 바꾸는 것입니다).

pathlib 에는 많은 편리한 편의 기능이 있습니다. read_text 는 훌륭하고 간결하며 파일을 열고 닫는 것에 대해 걱정할 필요가 없습니다. 파일과 관련하여 한 번에 모든 파일을 읽기만 하면 된다면 좋은 선택입니다.


LangeHaare

파일에 대한 목록 이해를 사용하는 또 다른 옵션이 있습니다.

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

이것은 대부분의 작업이 Python 인터프리터 내에서 수행되기 때문에 더 효율적인 방법입니다.


user1833244

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)

같은 결과를 얻을 수 있습니다.


moldovean

Python 2 및 Python 3으로 텍스트 파일 읽기 및 쓰기 그것은 유니 코드와 함께 작동합니다

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

고급 파일 쓰기/읽기

애플리케이션의 경우 다음이 중요할 수 있습니다.

  • 다른 프로그래밍 언어 지원
  • 읽기/쓰기 성능
  • 컴팩트함(파일 크기)

참조: 데이터 직렬화 형식 비교

구성 파일을 만드는 방법을 찾고 있다면 내 짧은 기사 Configuration files in Python 을 읽고 싶을 것입니다.


Martin Thoma

명령줄이나 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


oliland

또 다른 옵션은 numpy.genfromtxt 입니다. 예를 들면 다음과 같습니다.

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

이렇게 하면 data 가 파일에 있는 만큼의 행이 있는 NumPy 배열이 됩니다.


atomh33ls

가장 간단한 방법

간단한 방법은 다음과 같습니다.

  1. 전체 파일을 문자열로 읽기
  2. 문자열을 줄 단위로 분할

한 줄로 요약하면 다음과 같습니다.

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

그러나 이것은 2가지 버전의 콘텐츠를 메모리에 저장하므로 매우 비효율적인 방법입니다(작은 파일의 경우 큰 문제는 아니지만 여전히). [Mark Amery에게 감사드립니다.]

2가지 더 쉬운 방법이 있습니다.

  1. 파일을 반복자로 사용
 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')]
  1. Python 3.4 이상 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()]

Jean-Francois T.

splitlines() 함수를 사용하십시오. 다음은 예입니다.

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

출력에는 행 목록이 표시됩니다.


Abdullah Bilal

매우 큰/거대한 파일에 직면하고 더 빨리 읽고 싶다면(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)

pambda

몇 가지 추가 이점과 함께 이를 수행하는 가장 쉬운 방법은 다음과 같습니다.

 lines = list(open('filename'))

또는

 lines = tuple(open('filename'))

또는

 lines = set(open('filename'))

set 의 경우 줄 순서가 유지되지 않고 중복된 줄을 제거한다는 것을 기억해야 합니다.

아래에 @MarkAmery 의 중요한 보충 자료를 추가했습니다.

파일 객체에 .close 를 호출하지 않거나 with 문을 사용하지 않기 때문에 일부 Python 구현 에서는 파일을 읽은 후 닫히지 않을 수 있으며 프로세스에서 열린 파일 핸들이 누출됩니다 .

CPython (대부분의 사람들이 사용하는 일반적인 Python 구현)에서는 파일 객체가 즉시 가비지 수집되고 파일이 닫히기 때문에 문제가 되지 않지만 그럼에도 불구하고 다음과 같은 작업을 수행하는 것이 일반적으로 모범 사례로 간주됩니다 .

 with open('filename') as f: lines = list(f)

사용 중인 Python 구현에 관계없이 파일이 닫히도록 합니다.


simhumileco

이것을 사용하십시오:

 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() 를 사용하여 목록을 얻을 수도 있습니다.


Zero

개요 및 요약

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

다시 말하지만, ffileinput.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()

pathlib 모듈에서 새 Path 개체를 사용합니다(이는 내가 매우 좋아했으며 여기에서 사용할 것입니다).

 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 하는 것을 선호합니다.


Aaron Hall

문서에 빈 줄이 있는 경우 내용을 읽고 빈 문자열 요소를 방지하기 위해 filter

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

jeanggi90

나는 다음을 사용하는 것을 좋아합니다. 라인을 즉시 읽습니다.

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

또는 목록 이해를 사용하여:

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

Daniel

NumPy에서 loadtxt 명령을 사용할 수도 있습니다. 이것은 genfromtxt보다 적은 조건을 확인하므로 더 빠를 수 있습니다.

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

asampat3090

나는 아래에 언급된 방법 중 하나를 시도할 것입니다. 내가 사용하는 예제 파일의 이름은 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.> 두 번째 방법 에서는 Python Standard Library의 csv.reader 모듈을 사용할 수 있습니다.

 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 생성에 걸리는 시간은 두 방법에서 거의 동일합니다.


Siddharth Satpathy

다음은 파일 I/O를 단순화하는 데 사용하는 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라는 별도의 메소드로 read_lines 있습니다.


LogicalBranch

명령줄 버전

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

jasonleonhard

출처 : http:www.stackoverflow.com/questions/3277503/how-to-read-a-file-line-by-line-into-a-list

반응형