【问题标题】:Is there any convenient way to readline without the \n?没有\n,有没有方便的方法来读取行?
【发布时间】:2020-12-12 16:25:59
【问题描述】:

我有一个名为read_proxy的函数,我想读取文本的每一行:

def read_proxy():
    f = open('./proxy.txt', 'r')
    proxies = f.readlines()
    f.close()
    return proxies

if __name__ == '__main__':

    proxies = read_proxy()
    print(proxies)  # ['a\n', 'sad\n', 'asdasd\n', 'asdas\n', '1223\n', '43\n', '4576\n', '789\n', '90900-\n']
    

您会看到列表项,每个项的末尾都有一个\nread_proxy()怎么写,让我实现获取不带\n的每一行字符串?在我的选择中,我只能 forloop 每个项目然后将\n 去掉。

【问题讨论】:

    标签: python string file readline


    【解决方案1】:
    def read_proxy_without_newlines():
        f = open('./proxy.txt', 'r')
        proxies = f.readlines()
        f.close()
        return [p.rstrip('\n') for p in proxies]
    

    【讨论】:

    • 你的意思是只能获取\n的项目然后删除?不能在 open() 函数中做任何魔术吗?
    【解决方案2】:

    您可以尝试使用.read() 一次获取整个文件,然后使用str.split(),而不是使用.readlines(),它将每行单独读取到一个列表中并在最后保留\n把它变成一个行列表,但是这次删除换行符:

    def read_proxy():
        f = open('./proxy.txt', 'r')
        proxies = f.read().split('\n')
        f.close()
        return proxies
    

    【讨论】:

    • 您选择不使用with 表达式保护文件的任何原因?
    • @flakes 尽可能接近地复制 OP 的代码,只进行必要的修改来演示解决方案。当然,大多数时候使用with 是进行文件 I/O 的正确方法,包括在这种情况下,但这不是这个问题要问的。
    【解决方案3】:

    我不确定 Python 为何决定这样做,但遍历文件会返回其行。所以你也可以这样写:

    with open('./proxy.txt', 'r') as file:
        return [line.rstrip('\n') for line in file]
    

    对于非常大的文件,这可能比将整个文件读入内存然后解析它更有效。内存中不需要文件的两份副本(一份带换行符,一份不带换行符)。

    【讨论】:

    • 关于你的最后一点,我认为如果可能使用非常大的文件,那么可能需要重构调用代码,以便整个文件的 个副本存在于记忆中。然后,您可以改为提供一个生成器函数,一次生成一个(剥离的)行,调用者可以对其进行迭代。
    • 我同意你的观点,我可能不应该提出效率点。我的主要观点应该是(1)上下文管理器简化了代码,(2)文件句柄是可迭代的对象。我仍然认为这是一个不错的干净解决方案。
    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多