파이썬에서 호출
temp = open(filename,'r').readlines()
각 요소가 파일의 한 줄인 목록이됩니다. 그것은 약간 어리석지 만 여전히 readlines()
개별 요소에 개행 문자를 씁니다.
어떻게 피할 수 있습니까?
newline
에서 그 줄 바꿈 된 줄 바꿈에 대한 open의 주장을 세울 가치가 있다면 좋을 것 입니다.
파이썬에서 호출
temp = open(filename,'r').readlines()
각 요소가 파일의 한 줄인 목록이됩니다. 그것은 약간 어리석지 만 여전히 readlines()
개별 요소에 개행 문자를 씁니다.
어떻게 피할 수 있습니까?
newline
에서 그 줄 바꿈 된 줄 바꿈에 대한 open의 주장을 세울 가치가 있다면 좋을 것 입니다.
답변:
다음을 사용하여 전체 파일과 분할 선을 읽을 수 있습니다 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())
의 정확한 사본을 생성합니다 .f
f2
[line.rstrip('\n') for line in file]
하나 이상의 후행를 제거합니다 \n
.
[line[:-(line[-1] == '\n') or len(line)+1] for line in file]
대신에 될 수 있습니다 [line[:-(line[-1] == '\n') or None] for line in file]
.
for line in (x.strip() for x in f):
with
블록이 종료되면 파일 을 닫는다는 것을 명심하십시오. 즉 , I / O 오류가 발생하기 때문에 외부에서 with open(...) as f: lines = (line for line in f)
사용할 수 없습니다 . genexp를 사용하면 게으를 수 있지만 파일을 닫기 전에이를 소비해야합니다. lines
with
temp = open(filename,'r').read().split('\n')
\r\n
개행 은 어떻게 되나요? ;)
.split('\n')
줄 바꿈 규칙과 독립적으로 올바르게 분할됩니다. 이진 모드에서 파일을 읽는 경우 중요합니다.이 경우 splitlines()
범용 줄 바꿈을 처리하지만 split('\n')
그렇지 않은 경우
os.linesep
:)
\r\n
줄 끝에이되어 하지 로 변환 \n
그래서, 텍스트 또는 바이너리로 읽을 수 있는지, os.linesep
어디 일 것입니다 \n
하지 않습니다. 그러나 splitlines
파일이 os와 일치하지 않는 부분을 언급 한 경우 분명히 더 나은 선택입니다. 이 토론을보고있는 사람들이 그 존재를 알지 못하는 경우를 대비하여 주로 언급했습니다.
\r\n
있으며 Linux에서 실행 중일 때도 텍스트 파일로 변환됩니다.
또 다른 예:
한 번에 한 행씩 파일을 읽습니다. 문자열 끝에서 원하지 않는 문자 제거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)
이것이 최선의 선택이라고 생각합니다.
temp = [line.strip() for line in file.readlines()]
temp = [line.rstrip() for line in file.readlines()]
@Roland_Illig 메모의 의도를 얻는 데 사용할 수 있습니다 .
.readlines()
하면 전체 파일을 효과적으로 두 번 반복하고 있습니다.
이 시도:
u=open("url.txt","r")
url=u.read().replace('\n','')
print(url)
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()
.readlines()
같이 사용 하면 전체 파일을 두 번 효과적으로 반복 할 수 있습니다.
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;
[l.strip('\n\r') for l in temp]
. 또는 심지어rstrip
. 그리고 여기서 반복하기 때문에in open
대신 할 수 있습니다in temp
.