【问题标题】:Python won't rewrite file with first line removed using readlines() and for loopPython 不会重写使用 readlines() 和 for 循环删除第一行的文件
【发布时间】:2014-10-16 10:15:34
【问题描述】:

我用 Python 编写了一个网页抓取脚本,它从文本文件的第一行提取一个“ID”并将其附加到部分 URL;然后从所述 URL 下载图像。一切正常,但是当我使用第三个函数(其中包含用于下载的实际代码 - 这很好)运行它时,它不会通过删除第一行来更新文本文件。

我确定我在这里缺少一些东西,任何帮助将不胜感激。

def delete_used_id():
    # open and save all ids
    id_file_r = open('C:/Users/my.name/Documents/IDs.txt', 'r')
    lines = id_file_r.readlines()
    first_line_unf = str(lines[0])[3:]
    first_line = first_line_unf.strip()
    id_file_r.close()
    # reopen in write mode
    id_file_w = open('C:/Users/my.name/Documents/IDs.txt','w')
    for unused_id in lines:
        if unused_id != first_line:
            id_file_w.write(unused_id)
    id_file_w.close()
    print("Deleting used ID: " + first_line)

def get_id_from_file():
    id_file = open('C:/Users/my.name/Documents/IDs.txt', 'r')
    # slice the first 3 chars off of the string
    farmer_id_unf = id_file.readline()[3:]
    farmer_id = farmer_id_unf.strip()
    print("Getting Farmer ID: " + farmer_id)
    return farmer_id

【问题讨论】:

  • unused_id(整个第一行)怎么可能等于first_line(第一行,没有前三个字符,stripped)?为什么不只是for line in lines[1:]:
  • 当你说'for line in lines[1:]:'时,它会和'[3:]'做同样的事情吗?
  • 看起来您的问题是delete_used_id 中的 if 条件。您阅读第一个line[3:],然后检查unused_id。从逻辑上讲,它类似于检查"foobar"[3:] == "foobar" ,第一个只会是bar
  • lines[1:] 是列表的一部分,而不是字符串 (lines[0][3:]),否则是的;除了0th 之外的所有元素。
  • 感谢 jonrsharpe 解决方案的所有帮助!

标签: python string file-io web-scraping


【解决方案1】:

感谢 jonrsharpe 和 nerdwaller:

回答:

def delete_used_id():
    # open and save all ids
    id_file_r = open('C:/Users/my.name/Documents/IDs.txt', 'r')
    lines = id_file_r.readlines()
    first_line_unf = lines[0][3:]
    first_line = first_line_unf.strip()
    id_file_r.close()
    # reopen in write mode
    id_file_w = open('C:/Users/my.name/Documents/IDs.txt','w')
    for line in lines[1:]:
        id_file_w.write(line)
    id_file_w.close()
    print("Deleting used ID: " + first_line)

【讨论】:

  • 您不需要if line != first_line:,因为lines[1:] 是除第一行之外的所有行的列表。
  • 谢谢@PM 2Ring,现在将重构这个:)
猜你喜欢
  • 1970-01-01
  • 2019-03-14
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2022-10-20
  • 2016-09-04
相关资源
最近更新 更多