줄 바꿈없이 파일을 읽는 방법?


374

파이썬에서 호출

temp = open(filename,'r').readlines()

각 요소가 파일의 한 줄인 목록이됩니다. 그것은 약간 어리석지 만 여전히 readlines()개별 요소에 개행 문자를 씁니다.

어떻게 피할 수 있습니까?


4
스트립 사용 : [l.strip('\n\r') for l in temp]. 또는 심지어 rstrip. 그리고 여기서 반복하기 때문에 in open대신 할 수 있습니다 in temp.
gorlum0

11
파이썬 3 newline에서 그 줄 바꿈 된 줄 바꿈에 대한 open의 주장을 세울 가치가 있다면 좋을 것 입니다.
jxramos

답변:


554

다음을 사용하여 전체 파일과 분할 선을 읽을 수 있습니다 str.splitlines.

temp = file.read().splitlines()

또는 손으로 개행을 제거 할 수 있습니다.

temp = [line[:-1] for line in file]

참고 : 이 마지막 해결책은 파일이 줄 바꿈으로 끝나는 경우에만 작동합니다. 그렇지 않으면 마지막 줄은 문자를 잃게됩니다.

이 가정은 대부분의 경우에 특히 그렇습니다 (특히 텍스트 편집기로 작성된 파일의 경우 종종 줄 바꿈 문자를 추가하는 경우 많습니다 ).

이를 피하려면 파일 끝에 줄 바꿈을 추가하십시오.

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # go at the end of the file
    if f.read(1) != '\n':
        # add missing newline if not already present
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

또는 더 간단한 대안은 strip줄 바꿈 대신입니다.

[line.rstrip('\n') for line in file]

심지어 읽을 수는 없지만 :

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

의 반환 값이 or부울이 아니라 true 또는 false로 평가 된 객체라는 사실을 악용합니다 .


readlines방법은 실제로 다음과 같습니다.

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines

# or equivalently

def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

readline()개행을 readlines()유지하기 때문에 개행도 유지합니다.

참고 : 메소드의 대칭성을 readlines()위해 줄 바꿈을 추가 writelines()하지 않으므로 in f2.writelines(f.readlines())의 정확한 사본을 생성합니다 .ff2


1
참고 [line.rstrip('\n') for line in file]하나 이상의 후행를 제거합니다 \n.
Wes Turner

1
더 간단하게, [line[:-(line[-1] == '\n') or len(line)+1] for line in file]대신에 될 수 있습니다 [line[:-(line[-1] == '\n') or None] for line in file].
Wes Turner

10
이 솔루션은 전체 파일을 메모리로 읽습니다. 목록 이해의 대괄호를 괄호로 변경하면 한 번에 한 줄씩 파일을 반복 할 수있는 생성기 표현식이 작성됩니다. for line in (x.strip() for x in f):
Joseph Sheedy

2
@velotron 그것은 실제로 질문 / 답변의 요점이 아닙니다. 또한 : with블록이 종료되면 파일 을 닫는다는 것을 명심하십시오. 즉 , I / O 오류가 발생하기 때문에 외부에서 with open(...) as f: lines = (line for line in f)사용할 수 없습니다 . genexp를 사용하면 게으를 수 있지만 파일을 닫기 전에이를 소비해야합니다. lineswith
Bakuriu

@WesTurner. 그러나 후행 줄 바꿈은 두 개 이상 없습니다. 추가 줄 바꿈은 다음 빈 줄의 일부가 될 것입니다
Mad Physicist

38
temp = open(filename,'r').read().split('\n')

14
\r\n개행 은 어떻게 되나요? ;)
Wolph

26
파이썬은 보편적 인 줄 바꿈을 자동으로 처리하므로 .split('\n')줄 바꿈 규칙과 독립적으로 올바르게 분할됩니다. 이진 모드에서 파일을 읽는 경우 중요합니다.이 경우 splitlines()범용 줄 바꿈을 처리하지만 split('\n')그렇지 않은 경우
Bakuriu

7
그리고 항상있다 os.linesep:)
askewchan

1
내 시스템에 @LarsH, 그것은, 어떤 상황에서는 도움이 될 \r\n줄 끝에이되어 하지 로 변환 \n그래서, 텍스트 또는 바이너리로 읽을 수 있는지, os.linesep어디 일 것입니다 \n하지 않습니다. 그러나 splitlines파일이 os와 일치하지 않는 부분을 언급 한 경우 분명히 더 나은 선택입니다. 이 토론을보고있는 사람들이 그 존재를 알지 못하는 경우를 대비하여 주로 언급했습니다.
askewchan 님이

1
@askewchan 아마도 오래된 버전의 Python을 사용하고있을 것입니다. Python 3부터는 기본적으로 범용 줄 바꿈이 활성화되어 \r\n있으며 Linux에서 실행 중일 때도 텍스트 파일로 변환됩니다.
Arthur Tacca

13

또 다른 예:

한 번에 한 행씩 파일을 읽습니다. 문자열 끝에서 원하지 않는 문자 제거str.rstrip(chars)

with open(filename, 'r') as fileobj:
    for row in fileobj:
        print( row.rstrip('\n') )

또한 참조 str.strip([chars])str.lstrip([chars])

(파이썬> = 2.0)


10
temp = open(filename,'r').read().splitlines()

5
파일을 닫으시겠습니까? 나는 그것이 실제로 하나의 라이너가 아니라고 생각합니다 ...
Ray Hulha

9

이것이 최선의 선택이라고 생각합니다.

temp = [line.strip() for line in file.readlines()]

8
이 솔루션은 또한 앞뒤 공백을 제거합니다.
Roland Illig

그래도 이해력은 정말 좋습니다. 적어도 Python 3에서는 temp = [line.rstrip() for line in file.readlines()]@Roland_Illig 메모의 의도를 얻는 데 사용할 수 있습니다 .
bballdave025

모든 라인을 반복하려고한다면 왜 게으르지 않습니까? 을 사용 .readlines()하면 전체 파일을 효과적으로 두 번 반복하고 있습니다.
AMC

1

이 시도:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  

4
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 귀하의 코드 제안 이유를 모를 수도 있습니다. 코드와 설명의 가독성을 떨어 뜨리므로 설명 주석으로 코드를 혼동하지 마십시오!
Goodbye StackExchange 2013

왜 누군가가 다른 대안 솔루션보다 이것을 사용 해야하는지 모르겠습니다.
AMC

-1
my_file = open("first_file.txt", "r")
for line in my_file.readlines():
    if line[-1:] == "\n":
        print(line[:-1])
    else:
        print(line)
my_file.close() 

3
다른 사람들에게 유용 할 수 있도록 설명을 추가하십시오.
samuellawrentz

컨텍스트 관리자를 사용하여 파일 오브젝트를 처리하고 파일을 직접 반복해야합니다. 이와 .readlines()같이 사용 하면 전체 파일을 두 번 효과적으로 반복 할 수 있습니다.
AMC

-2
import csv

with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])

2
그러나 줄에 쉼표가 있으면 어떻게해야합니까?
gilch

-8
def getText():
    file=open("ex1.txt","r");

    names=file.read().split("\n");
    for x,word in enumerate(names):
        if(len(word)>=20):
            return 0;
            print "length of ",word,"is over 20"
            break;
        if(x==20):
            return 0;
            break;
    else:
        return names;


def show(names):
    for word in names:
        len_set=len(set(word))
        print word," ",len_set


for i in range(1):

    names=getText();
    if(names!=0):
        show(names);
    else:
        break;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.