如果遇到Python的某些编码,如何仅从文本文件中删除第一行



我试图通过在文本文件底部附加新代理来不断更新具有最新数据(活动代理 Ip 和端口(的文件,我想删除第一行(这基本上就像从下滚动所有可用的最新代理 ip(。 计算行数并附加最新的代理不是问题,代码有效,但是我在只删除第一行而不删除(覆盖整个文本文件(时遇到问题

这是我的代码:

proxy_list = ['proxy1','proxy2','proxy3','etc','etc'] # List of tested proxy
for proxy in proxy_list:
    number_of_lines_in_file = sum(1 for line in open('proxies.txt'))
    if number_of_lines_in_file >= 30:
        with open('proxies.txt', 'w',encoding='utf-8') as update_new_proxies_file:
            for index, line in enumerate(proxy.strip()):
                if index == 1:
                    update_new_proxies_file.write(proxy)

但是,这会删除/覆盖整个文本文件。

有没有办法只删除第一行而不删除下面的所有其他内容?

您需要先读取文件,然后将其重写回除第一行以外的文件

with open('proxies.txt', 'r+', encoding='utf-8') as update_new_proxies_file:
    data = update_new_proxies_file.read().splitlines(True)
    update_new_proxies_file.truncate(0)
    update_new_proxies_file.writelines(data[1:])

由于文件在内存中的结构,通常不可能在不重写整个文件的情况下在开始时截断文件。在大多数文件系统中,文件由大小和可变数量的固定大小(例如 4096 字节(的块组成。文件的第一个字节必须位于其中一个块的开头。如果删除第一行仅删除 20 个字节,则必须将其他字节移动到块的开头,并且还必须移动所有其他块中的数据。

相比之下,在末尾截断很容易。只需删除所有不再是文件一部分的块并更改文件的大小。无需复制。

这可能是文件系统驱动程序仅支持在末尾截断的原因。在开始时截断可以扩展在简单的系统调用中执行此操作。您唯一能做的就是逐行读取文件,跳过第一行并将所有其他行写入临时文件。最后用临时文件替换原始文件。

最新更新