读取没有换行符的文件

在Python中,调用

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

产生一个列表,其中每个元素是文件中的一行。 它有点愚蠢,但仍然: readlines()也写入换行符到每个元素,我不希望发生的事情。 我怎样才能避免它?

您可以使用str.splitlines来读取整个文件和拆分行:

 temp = file.read().splitlines() 

或者你可以用手去掉换行符:

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

注意:最后一个解决scheme只在文件以换行符结束时才起作用,否则最后一行将失去一个字符。

这个假设在大多数情况下都是正确的(特别是对于由文本编辑器创build的文件,无论如何通常添加结束的新行)。

如果你想避免这种情况,你可以在文件末尾添加一个换行符:

 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] 

或者更简单的select是去掉换行符:

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

甚至,虽然相当不可读:

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

它利用了返回值or不是布尔值的事实,而是被评估为真或假的对象。


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()方法不会添加结束换行符,因此f2.writelines(f.readlines())会在f2生成f的精确副本。

 temp = open(filename,'r').read().split('\n') 
 import csv with open(filename) as f: csvreader = csv.reader(f) for line in csvreader: print(line[0]) 
 temp = open(filename,'r').read().splitlines() 
 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;