[python] 파이썬에서 한 줄씩 파일을 목록으로 읽으려면 어떻게해야합니까?


14 Answers

입력 및 출력 참조 :

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

또는 개행 문자를 제거하는 방법 :

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

편집자 주 : Janus Troelsen의 코멘트에 의해 암시 된이 답변의 원래 공백 제거 명령 line.strip()후행 공백뿐만 아니라 앞뒤 공백을 모두 제거 합니다 .

Question

어떻게 파이썬에서 파일의 모든 라인을 읽고 각 라인을리스트에 요소로 저장합니까?

줄 단위로 파일을 읽고 각 줄을 목록 끝에 추가하려고합니다.




매우 크고 거대한 파일에 직면하고 더 빠르게 읽을 수 있기를 원한다면 (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)



다른 옵션은 numpy.genfromtxt 입니다 (예 :

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

그러면 파일에있는 행 수만큼 data 가 NumPy 배열이됩니다.




Python 2 + 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)

주의 사항 :

  • 는 소위 컨텍스트 관리자 입니다. 열려있는 파일이 다시 닫히는 지 확인합니다.
  • .strip() 또는 .rstrip() 을 단순히 만드는 모든 솔루션은 공백을 제거하므로 lines 을 재생하지 못합니다.

공통 파일 엔딩

.txt

고급 파일 쓰기 / 읽기

  • CSV : 슈퍼 단순 형식 ( 읽기 및 쓰기 )
  • JSON : 사람이 읽을 수있는 데이터를 작성하는 데 좋습니다. 매우 일반적으로 사용되는 ( 읽기 및 쓰기 )
  • YAML : YAML은 JSON의 상위 집합이지만 읽기 쉽도록 ( 읽기 및 쓰기 , JSON과 YAML 비교 )
  • pickle : 파이썬 직렬화 형식 ( 읽기 & 쓰기 )
  • MessagePack ( Python 패키지 ) :보다 간결한 표현 ( 읽기 및 쓰기 )
  • HDF5 ( Python 패키지 ) : 행렬에 좋음 ( 읽기 및 쓰기 )
  • XML : 역시 존재 * 한숨 * ( read 및 write )

응용 프로그램의 경우 다음 사항이 중요 할 수 있습니다.

  • 다른 프로그래밍 언어 지원
  • 읽기 / 쓰기 성능
  • 압축률 (파일 크기)

관련 항목 : 데이터 직렬화 형식의 비교

오히려 설정 파일을 만드는 방법을 찾고 있다면 필자의 짧은 기사 인 Python의 설정 파일




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

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



가장 간단한 방법

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

  1. 전체 파일을 문자열로 읽습니다.
  2. 문자열을 줄 단위로 나눕니다.

한 줄에서는 다음과 같이 나타낼 수 있습니다.

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



목록에 파일 줄 읽기의 깨끗하고 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ã.



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

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

다행스럽게도 파이썬은 파일을 목록으로 읽어들이는 가장 짧은 방법은 다음과 같습니다.

lst = list(open(filename))

그러나 나는 더 많은 설명을 추가 할 것이다.

파일 열기

특정 파일을 열고 싶다고 가정하고 파일 핸들 (또는 파일 같은 핸들)을 직접 다루지는 않습니다. 파이썬에서 파일을 여는 가장 보편적으로 사용되는 함수는 open 되어 있으며 파이썬 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 한다는 사실에 대해 이야기 해 봅시다. 그렇지 않으면 프로세스가 종료되거나 파이썬이 파일 핸들을 garbages 할 때까지 파일 핸들을 파일에 대해 열린 상태로 유지합니다.

사용할 수있는 동안 :

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

그러나 파이썬은 구문이 더 깔끔한 컨텍스트 관리자를 제공합니다 (그러나 open 보면 try 와 거의 동일합니다).

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

마지막 접근법은 파이썬에서 파일을 여는 데 권장되는 접근법입니다!

파일 읽기

좋아요, 파일을 열었습니까? 이제 어떻게 읽습니까?

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

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

그러면 파일의 각 행이 인쇄됩니다. 그러나 각 줄에는 끝에 줄 바꿈 문자 \n 이 포함됩니다 (파이썬이 보편적 인 줄 바꿈 지원으로 빌드되었는지 확인하는 것이 좋습니다. 그렇지 않으면 Windows에서 \r\n 또는 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 "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] 접근법 [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() 이지만 목록에 저장하기 전에 행을 처리하려면 간단한 목록 이해를 권장합니다.



저는 다음을 사용하고 싶습니다. 즉시 라인을 읽으십시오.

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

또는 목록 이해력 사용 :

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



필자의 지식에 따르면 파이썬에는 네이티브 배열 데이터 구조가 없습니다. 그러나 배열보다 사용하기가 훨씬 쉬운 목록 데이터 구조를 지원합니다.

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



splitlines () 함수 만 사용하면됩니다. 다음은 그 예입니다.

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

출력에는 라인 목록이 있습니다.




이것은 open 명령을 캡슐화해야합니다.

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



with open(fname) as fo:
        data=fo.read().replace('\n', ' ').replace (',', ' ')

귀하의 질문에 대한 대답입니다. replace 함수는 파일을 제거하기위한 구분 기호로 사용됩니다.




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

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 패스만으로 파일을 검토 할 것입니다. 이것은 일반적으로 범용 파서가 작동하는 방법입니다.




그러면 파일의 "배열"이 생깁니다.

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


Related