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





15 Answers

입력 및 출력 참조 :

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

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

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

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

세기 데이터 가져

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

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




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

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



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

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




목록에 데이터

다음과 같은 데이터가 포함 된 텍스트 파일이 있다고 가정합니다.

텍스트 파일 내용 :

line 1
line 2
line 3
  • 같은 디렉터리에서 cmd를 엽니 다 (마우스 오른쪽 단추로 클릭하고 cmd 또는 PowerShell 선택).
  • 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)



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



나는 이렇게 할거야.

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



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

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

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




가장 간단한 방법

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

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

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

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



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

이제 변수 out은 원하는 목록 (배열)입니다. 다음 중 하나를 수행 할 수 있습니다.

for line in out:
    print line

또는

for line in f:
    print line

당신은 같은 결과를 얻을 것이다.




진정한 쉬운 방법 :

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

본격적인 프로그램으로 만들려면 다음을 입력하십시오.

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.")

어떤 이유로, .py 파일을 제대로 읽지 않습니다.




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



Python 3.4에서 소개 된 pathlib 는 다음과 같이 파일에서 텍스트를 읽는 데 매우 편리한 방법을 제공합니다.

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

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

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




다음 코드로 쉽게 할 수 있습니다.

lines = open(filePath).readlines()



명령 행 버전

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



개요 및 요약

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 사용

아래의 각각에 대한 사용 사례를 설명합니다.

파이썬에서 파일을 한 줄씩 어떻게 읽습니까?

이것은 훌륭한 질문입니다. 먼저 몇 가지 샘플 데이터를 만듭니다.

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 은 둘 다 / return lazy iterator입니다. 한 번만 이터레이터를 사용할 수 있기 때문에 자세한 기능을 피하면서 기능 코드를 제공 할 수 있습니다. 여기서 좀 더 간결한 fileinput.input(filename) 을 사용합니다. 여기서 apropos를 사용하십시오.

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

아,하지만 왠지 명단에 넣고 싶습니까? 가능하다면 나는 그것을 피할 것입니다. 그러나 주장하는 경우 ... fileinput.input(filename) 의 결과를 list 전달 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))

결론

파일에서리스트로 줄을 만드는 많은 방법을 보았지만 목록에 많은 양의 데이터가 나타나지 않도록하고 가능하다면 파이썬의 느린 반복을 사용하여 데이터를 처리하는 것이 좋습니다.

즉, fileinput.input 또는 with path.open() as f 좋습니다.




Related