Python-如何读取没有换行符的文件?

发布于 2021-02-02 23:21:33

在Python中,调用

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

产生一个列表,其中每个元素都是文件中的一行。这有点愚蠢,但是仍然:readlines()还为每个元素写换行符,这是我不希望发生的事情。

如何避免呢?

关注者
0
被浏览
208
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    您可以使用读取整个文件并分割行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()方法对称,不会添加结尾换行符,因此f2.writelines(f.readlines())会生成fin 的精确副本f2。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看