如何向文件写入非重复ISBN的信息?现有代码需完善
解决重复ISBN书籍信息写入问题
首先得说,你现在的代码逻辑有点走偏了——比如按字符长度循环range(1,len(message))完全不是在处理书籍条目,而是在逐个字符遍历文本,这肯定达不到去重的目的。咱们重新梳理下思路:要实现「只写入未存在的ISBN信息」,核心是先记录已有的ISBN,再检查新条目是否重复。
核心步骤梳理
- 从
download.txt里读出所有已经存在的ISBN,存到一个集合里(集合查询重复的效率最高)。 - 从
e.txt里拆分出每一条书籍信息,提取对应的ISBN。 - 如果这个ISBN不在已有的集合里,就把这条信息追加到
download.txt,同时把ISBN加入集合避免后续重复。
修正后的代码示例
# 第一步:读取已有的ISBN,存入集合 existing_isbns = set() try: with open('download.txt', 'r') as d_file: for line in d_file: # 从每行中提取ISBN,沿用你原来的提取逻辑(可根据实际格式调整) for segment in line.split(): if segment.startswith("isbn"): isbn = segment[8:-1] # 适配格式如 isbn="123456",去掉前后的标识字符 existing_isbns.add(isbn) except FileNotFoundError: # 如果download.txt还没创建,就初始化空集合 pass # 第二步:处理e.txt中的新书籍条目 with open('e.txt', 'r') as c_file: full_content = c_file.read() # 按"book"分割出每个书籍条目(跳过分割后第一个空字符串,因为原文本开头可能是book) book_items = full_content.split('book')[1:] # 第三步:追加写入不重复的条目 with open('download.txt', 'a') as d_file: for item in book_items: current_isbn = None # 提取当前条目的ISBN for segment in item.split(): if segment.startswith("isbn"): current_isbn = segment[8:-1] break # 检查ISBN是否存在,不存在就写入 if current_isbn and current_isbn not in existing_isbns: # 把分割掉的"book"补回去,拼成完整条目 full_book_entry = 'book' + item d_file.write(full_book_entry + '\n') # 加换行符,让条目更清晰易读 existing_isbns.add(current_isbn)
关键细节说明
- 用
with语句处理文件:自动帮你关闭文件,避免忘记关文件导致的资源泄漏问题。 - 集合存储ISBN:集合的
in操作比列表快很多,尤其是当文件里的条目越来越多的时候,效率差距会很明显。 - 条目分割逻辑:这里假设你的
e.txt里每个书籍条目都是以book开头的,如果实际格式是按空行分隔,把split('book')改成split('\n\n')就行。 - ISBN提取适配:如果你的ISBN格式不是
isbn="XXXX",比如是isbn: 978123456,那把segment[8:-1]改成segment.split(':')[1].strip()就可以,完全根据实际格式调整。
内容的提问来源于stack exchange,提问作者Marta
相关产品推荐
相关产品推荐

