Python删除文件行报错:OSError [WinError 123] 文件名语法错误
解决Python删除学生数据库指定ID行的问题
错误根源分析
os.remove(line)的错误:os.remove()是用来删除整个文件的工具,你把文件里的一行内容(比如'SanVin22\tSanji\tVinsmoke\tsanji@gmail.com\tWellington\t')当作文件名传入,这行内容包含制表符\t,完全不符合文件名的语法规则,直接触发WinError 123。r+模式直接write清空文件的问题:用r+打开文件后,初始指针在文件开头,直接写入会覆盖原有内容;循环读取完所有行后,指针移到文件末尾,此时写入的内容会追加到末尾,但因为没有保留非目标行的逻辑,最终导致原有内容被混乱覆盖,看起来像是文件被清空。
正确实现方法
删除文件指定行的标准逻辑是:读取所有行,筛选出需要保留的行,再重新写入文件。修正后的代码如下:
def DelStudent(self, data, target_id): # 注意:不要用self = id,self是类实例本身,应传入要删除的ID作为参数 # 1. 读取所有行,筛选出非目标ID的行 with open(data, "r") as datafile: # 加判断避免空行或格式错误行导致索引越界 keep_lines = [line for line in datafile if line.strip() and line.split()[0] != target_id] # 2. 重新写入文件(覆盖原有内容) with open(data, "w") as datafile: datafile.writelines(keep_lines)
关键细节
- 拆分读写操作:分开用只读和写入模式处理文件,避免文件指针位置混乱导致的内容覆盖问题。
- 修正参数逻辑:原代码中
self = id属于错误用法,self是类的实例对象,不能随意赋值,应将目标ID作为独立参数传入(示例中为target_id)。 - 边界处理:添加
line.strip()判断,避免空行或格式错误的行触发line.split()[0]索引越界异常。
大文件适配写法
如果学生数据库文件体积较大,一次性读取所有行占用内存过高,可以用临时文件分块处理:
import os def DelStudent(self, data, target_id): temp_file = f"{data}.tmp" with open(data, "r") as infile, open(temp_file, "w") as outfile: for line in infile: if line.strip() and line.split()[0] != target_id: outfile.write(line) # 用临时文件替换原文件 os.replace(temp_file, data)
内容的提问来源于stack exchange,提问作者paparonnie
相关产品推荐
相关产品推荐

