我试图通过在文本文件底部附加新代理来不断更新具有最新数据(活动代理 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 个字节,则必须将其他字节移动到块的开头,并且还必须移动所有其他块中的数据。
相比之下,在末尾截断很容易。只需删除所有不再是文件一部分的块并更改文件的大小。无需复制。
这可能是文件系统驱动程序仅支持在末尾截断的原因。在开始时截断可以扩展在简单的系统调用中执行此操作。您唯一能做的就是逐行读取文件,跳过第一行并将所有其他行写入临时文件。最后用临时文件替换原始文件。