2012-09-08 63 views
192

在Python文件,调用读而不换行符

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

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

+2

使用条:'[l.strip( '\ n \ r'),用于在升温度]'。甚至是“rstrip”。自从这里迭代它可以'开放',而不是'在温度'。 – gorlum0

+13

这个问题是对我拥有的每一个声望评分负责 – Yotam

+3

如果在Python 3中有一个值,可以将打开的'newline'参数设置为那些小块尾随的换行符,那么我会很好。 – jxramos

回答

276

可以使用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] 

这利用了事实,返回VA or的lue不是布尔值,而是被评估为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()方法不添加结束换行符,所以在f2.writelines(f.readlines())产生f2f完全相同的副本。

+0

请注意''[line.rstrip('\ n')用于文件中的行]''会删除多个尾部的''\ n''。 –

+0

更简单地说,''[line [:-(line [-1] =='\ n')或len(line)+1]可以替换为''[line [:-(line [-1] =='\ n')或者None]用于文件中的行]''。 –

+0

这些解决方案将整个文件读入内存。将列表理解的方括号改为括号会产生一个生成器表达式,它允许您一次一行地遍历文件:'for line in(x.strip()for f in f):' – velotron

19
temp = open(filename,'r').read().split('\n') 
+8

尽管'\ r \ n'换行符会发生什么? ;) – Wolph

+0

@WoLpH是的,我没有考虑平台特定的换行符。它会给错误的东西。 – vivek

+11

Python自动处理通用换行符,因此'.split('\ n')'将独立于新行约定正确分割。 如果你以二进制模式读取文件,那将会很重要。在这种情况下'splitlines()'处理通用换行符,而'split'('\ n')'不处理。 – Bakuriu

-2
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; 
1
import csv 

with open(filename) as f: 
    csvreader = csv.reader(f) 
    for line in csvreader: 
     print(line[0]) 
2
temp = open(filename,'r').read().splitlines() 
0

尝试这种情况:

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

虽然这段代码可以解决这个问题,但是[包括解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要使用解释性注释来挤占代码,因为这会降低代码和解释的可读性! – FrankerZ

相关问题