【问题标题】:Python read file determined by separator \r\nPython 读取文件由分隔符确定 \r\n
【发布时间】:2018-11-04 14:25:05
【问题描述】:

我只想读取由换行符 \r\n 确定的文件,\r 和 \n 应该被视为字符串的一部分,而不是行尾。

我正在尝试使用

open('file.txt', 'rU').read().split('\r\n')

但是打开文件后我看不到任何 \r 字符,所以可能我必须用不同的标志或不同的方式打开文件。

任何想法如何解决这个问题?

编辑:抱歉没有指定 python 的版本,我使用的是版本 3。

【问题讨论】:

    标签: python file newline


    【解决方案1】:

    用'rb'打开文件:

    open('file.txt', 'rb').read().split('\r\n')

    我发现创建一个只有 CR 和 LF 的文本文件有点挑战,但 Notepad++ 帮助了我。

    有了这个内容:

    CRLF\r\nCR\rLF\nCRLF\r\n

    使用print open('file.txt', 'rb').read().split('\r\n')

    我得到了这个输出:

    ['CRLF', 'CR\rLF\nCRLF', '']

    【讨论】:

    • 嗯,这不是二进制类型的文件,所以当我尝试这样做时,我有错误:TypeError: a bytes-like object is required, not 'str'
    • 我使用的是 Python 2.7 - 你没有指定 Python 3。
    • 它可以工作,但你必须使用 .read().decode().split... 例如。
    【解决方案2】:

    barny answer(使用二进制模式)在 Python 2 中完美运行,但需要在 Python 3 中进行调整,因为以二进制形式打开文件会返回其内容为 bytes,而不是 str。

    此外,如果文件很大,一次读取整个文件的事实可能是内存方面的问题。

    在 Python 3 中,您可以将 newline 参数传递给 open,因此它会根据该参数而不是默认值进行拆分。

    with open("temp.txt","r",newline="\r\n") as f:
        for line in f:
           ....
    

    line 包含文本加上末尾的\r\n(使用line = line.rstrip() 删除)。

    如果行中有\n 字符(不在\r 后面),则将它们作为普通字符读取。

    【讨论】:

    • 谢谢,这也很有效,但我认为我标记的解决方案要好一些(代码更少:))
    • 无论您选择什么(加上我对decode 的评论甚至不在答案中,您都解决了这个问题)。此外,尝试使用其他解决方案打开一个 30Gb 文件,并在开始时执行完整的读取 + 拆分:)
    • 无论如何,有趣的问题:)
    【解决方案3】:

    我认为在文本模式下读取文件时,\r\n 正在被翻译为 \n。

    我不是 100% 确定你想要达到什么目标,但在我看来你想要做什么:

    with open("file.txt", "rU") as f:
        return f.readline()
    

    这将读取一行(包括 \n)。如果您希望将行作为列表:

    with open("file.txt", "rU") as f:
        return f.readlines()
    

    或者你可以只迭代 f。

    【讨论】:

    • 我有这样的文件: 第一行 \r\n 第二行 \n 第三行 \r\n 作为分割文件的结果,我应该有这样的输出: 1. String = "First line Second line" 2. String = "第三行"
    猜你喜欢
    • 2021-12-17
    • 2015-07-22
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多