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


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.