Python에서 파일 내용을 읽고 쓰는 가장 쉬운 방법


82

Ruby에서는 s = File.read(filename). 내가 파이썬에서 아는 가장 짧고 명확한 것은

with open(filename) as f:
    s = f.read()

더 짧고 (바람직하게는 한 줄) 더 읽기 쉽게 만드는 다른 방법이 있습니까?

참고 : 처음에는 질문을 "한 줄의 코드로 수행"이라고 표현했습니다. S.Lott가 지적했듯이, 짧다고해서 더 가독성이 좋은 것은 아닙니다. 그래서 나는 단지 내가 의미하는 바를 명확히하기 위해 내 질문을 다시 표현했습니다. 나는 Ruby 코드가 한 줄 대 두 줄이기 때문에 반드시 더 낫고 더 읽기 쉽다고 생각합니다 (그것도 중요하지만), 또한 누가 파일을 닫는 지에 대한 질문을 제기하지 않는 인스턴스 메서드와는 반대로 클래스 메서드이기 때문에, 아래 답변에서 지적했듯이 GC를 사용하여 파일을 닫을 수 있지만 (따라서 한 줄로 만드는) 코드가 더 나빠집니다. 더 짧지 만. 휴대가 불가능할뿐만 아니라 명확하지 않게 만드는 것입니다.


7
자신 만의 기능을 만드십시오. 그런 다음 그것을 사용하여 내용을 얻을 수 있습니다. 전화는 한 줄입니다.
Felix Kling

1
궁금한 점이 있습니다. Ruby 문이 파일도 닫습니까?
dheerosaur

8
-1 : 코드 골프에서이기는 사람은 없습니다.
S.Lott

3
내 질문은 나에게 의미가 있습니다. 이 두 줄을 작성하는 더 나은 방법을 찾으려고합니다 ( with2.5 의 문 앞에 4 줄 ). 방법이있을 수도 있고 없을 수도 있습니다. 난 항상 알아 내려고 노력할 수 있지? 마음에 들지 않으면 반대표를 던지고 계속 진행하십시오. :)
ibz

1
의 장점은 File.readlines("filename")이름이 지정된 파일의 내용을 읽는 것입니다. 증거에는 파일 핸들, 설명자 또는 개체가 없습니다. 내가 본 모든 파이썬 "동등"에는 명시 적 열기 / 닫기 (또는 더 나쁜 것은 명시 적 닫기가 필요한 암시 적 열기)가 포함됩니다.
Mark Reed

답변:


11

라이브러리 사용에 개방적이라면 forked-path (easy_install 또는 pip 사용)를 설치해보십시오 .

그런 다음 다음을 수행 할 수 있습니다.

from path import path
s = path(filename).bytes()

이 라이브러리는 상당히 새롭지 만 수년 동안 Python 주위에 떠다니며 꽤 많이 사용 된 라이브러리의 포크입니다. 나는이 라이브러리 년 전 발견 이후, 나는 매우 드물게 사용하지 os.path또는 open()더 이상.


멋진 도서관처럼 보입니다. 이것을 위해 설치하지는 않겠지 만 명심할 것입니다.
ibz

1
나는 이것이 전체 해킹이기 때문에 이것이 왜 받아 들여지는 대답인지 이해하지 못합니다!
nikolay

Windows에서 pip 18.6에 의해 설치된 분기 경로 v0.2.3은 Python 3.6.4와 호환되지 않습니다. 8 진수 상수에 사용되는 형식 (예 : 0777대신 0o0777)이 현재 Python 버전에서 지원되지 않는 것 같습니다 .
Christoffer Soop

Eyal Levin의 답변에 +1 . 내가 8 년 전에 처음 답변했을 때 pathlib 또는 pathlib2가 존재했다면 분기 경로보다는 언급했을 것입니다. 나는 몇 년 동안 갈래 길을 사용하지 않았습니다.
snapshoe


43

위와 동일하지만 오류를 처리하지 않습니다.

s = open(filename, 'r').read()

21
실제로는 파일을 열어 둡니다.
ibz

3
CPython 구현은 참조 횟수가 0이 될 때 파일을 닫지 만, 이것은 의존해서는 안되는 구현 세부 사항입니다.
Mark Tolonen

1
이것은 오류를 처리합니다. 평소와 같이 예외가 발생합니다. "파일을 열어 두는" 것은 아니지만 GC 구현에 따라 파일 닫기가 지연 될 수 있습니다 . 이는 문제가 될 수 있지만 (Windows에서 잠김, 예를 들어 여러 파일을 반복하는 경우 FD 제한) 파일을 열어 두는 것과는 매우 다릅니다 (예 : 파일 유출).
Glenn Maynard

11
디자인 목표가 "한 줄의 코드"인 경우 Perl을 너무 많이 흡입 한 것이므로 심각한 세뇌 제거 시간을 예약해야합니다.
Glenn Maynard

6
아니오, 이것은 조금도 혼란스럽지 않습니다.
Glenn Maynard

36

pathlib를 사용하십시오 .

Python 3.5 이상 :

from pathlib import Path
contents = Path(file_path).read_text()

낮은 버전의 Python의 경우 pathlib2를 사용 하십시오 .

$ pip install pathlib2

그때

from pathlib2 import Path
contents = Path(file_path).read_text()

쓰기도 쉽습니다.

Path(file_path).write_text('my text')

18
contents = open(filename).read()

9
그리고 언제 파일을 닫습니까?
ibz

1
@ionut bizau-반환 open(...)이 쓰레기 수거 일 때 나는 생각합니다. 내가 틀렸다면 누군가 나를 바로 잡습니다.
detly

1
이것이 가장 짧은 방법입니다. 투표가없는 이유를 모르겠습니다.
Pritesh Acharya

10

이것은 Perl이 아닙니다. 여러 줄의 코드를 한 줄에 강제로 맞추고 싶지는 않습니다. 함수를 작성한 다음 함수를 호출하면 한 줄의 코드가 필요합니다.

def read_file(fn):
    """
    >>> import os
    >>> fn = "/tmp/testfile.%i" % os.getpid()
    >>> open(fn, "w+").write("testing")
    >>> read_file(fn)
    'testing'
    >>> os.unlink(fn)
    >>> read_file("/nonexistant")
    Traceback (most recent call last):
        ...
    IOError: [Errno 2] No such file or directory: '/nonexistant'
    """
    with open(fn) as f:
        return f.read()

if __name__ == "__main__":
    import doctest
    doctest.testmod()

5

느리고 추하고 플랫폼에 따라 ...하지만 한 줄짜리 ;-)

import subprocess

contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0]

3
aaaaaaaaaaargh! (최소 문자 제한을 충족하는 초과 'a')
Peter Gibson

5
확실히 질문의 정신과 일치합니다 ... Python을 Bash와 비슷하게 만드는 비뚤어진 사용은 Ruby 또는 Perl과 비슷하게 만드는 것보다 나쁘지 않습니다.
detly

3

다음과 같이 간단합니다.

    f=open('myfile.txt')
    s=f.read()
    f.close()

콘텐츠 "s"로 원하는대로


-1
contents = open(filename)

이것은 생성기를 제공하므로 값을 어딘가에 저장해야합니다.

contents = [line for line in open(filename)]

이것은 목록에 대한 저장을 명시 적으로 닫는 것은 불가능합니다 (적어도 Python에 대한 지식으로).


1
및 (오픈 (파일 이름에 줄 선)) .join 내용 = ''당신은 ... 원본 파일의 내용이
eumiro

파일을 반복자로 사용 하면 파일이 결정적으로 닫히지 는 않습니다 (처럼 with). 반복이 완료된 후에도 파일을 찾고 다시 읽기를 시작하는 것이 여전히 유효하기 때문에 반복이 파일을 닫으면 작동하지 않습니다.
Glenn Maynard

@Glenn 그러나 내 예제와 같이 목록 이해에서 생성기를 사용하면 이름이 없어 닫을 수도 없습니다.
Tony Veijalainen

"닫을 수없는"입니다 하지 "을 닫을 필요가 없습니다"와 같은.
Glenn Maynard

그럴 수도 있지만 목록 이해력에서 해당 파일 핸들에 액세스하는 방법을 모를 것입니다. 파이썬에서 '모든 파일 i / o 완료, 모든 프로그램 열린 파일 닫기'명령일까요? 아니면 파일 객체에 대한 명시적인 gc로 충분할까요? 목록 이해가 별도의 범위이므로 파일 핸들은 범위를 벗어납니다.
Tony Veijalainen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.