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.