阅读没有换行符的文件

问题:

在Python中,调用

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

导致一个列表,其中每个元素是文件中的一行。它有点愚蠢,但仍然:readlines()也为每个元素写入换行符,我不想发生的事情。我该如何避免呢?

回答:

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

temp = file.read().splitlines()

或者您可以手动剥离换行符:

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

 注意:此最后一个解决方案仅在文件以换行符结尾时才起作用,否则最后一行将丢失一个字符。
在大多数情况下,这种假设是正确的(特别是对于由文本编辑器创建的文件,通常do添加结束换行符)。
如果您想避免这种情况,您可以在文件末尾添加换行符:

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()方法not添加结尾换行符,所以f2.writelines(f.readlines())f2中产生f的精确副本

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Reading a file without newlines

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 7 = 11