删除文件中的一行

时间:2013-11-06 21:03:47

标签: python loops line

我遇到了一个时间跟踪程序的问题,我试图通过迭代它然后写行来识别文件中的一行,除非有任何变量“delete”在其中,由于某种原因它浏览文件并说它已删除,但循环不会删除任何行。

date = input(" What is today's date? month-day-year format please. (E.G. 01-14-2003) ")
if os.path.exists(date):
    today = open(date, "r")
    print(today.read())

    delete = input(" Which appointment would you like to delete? (Please type the time E.G. 7:00) ")

    #Open the file, save the read to a variable, iterate over the file, check to see if the time is what user entered, if it is not then write it to the line, close the file.

    fileEdit = open(date, "r+")
    for line in today.readline():
        print(line)
        if delete not in line:
            fileEdit.write(line)
    print(fileEdit.read())
    today.close()
    fileEdit.close()
    print ("Appointment deleted, goodbye")

4 个答案:

答案 0 :(得分:2)

这是读到文件的末尾

print(today.read())

当你开始在这里进行迭代时,你已经在最后了

for line in today.readline():

所以永远不会输入for循环。您需要重新打开文件或寻找回头。

另一个问题是你正在迭代第一行。你可能意味着

for line in today:

无论如何,写入您正在阅读的同一文件通常不是一个好主意(例如,如果计算机中途重置,请考虑该文件会出现的混乱)

最好写一个临时文件并替换。

如果文件非常小,您可以将文件读入内存中的列表,然后再次重写文件。

更好的想法,在你走得太远之前,使用数据库,例如sqlite模块(内置于Python)

答案 1 :(得分:1)

today.readline()返回一行。 for - 循环遍历该行中的字符。并且@gnibbler pointed out today文件在today.readline()被调用时位于文件末尾(因此它返回一个emtpy字符串)。

通常,要删除文件中间的某些内容,您需要完全替换该文件。 fileinput模块可以提供帮助:

import fileinput

for line in fileinput.input([date], inplace=1):
    if delete not in line:
       print line, # stdout is redirected to the `date` file

这里差不多但没有fileinput

import os
from tempfile import NamedTemporaryFile

filename = date
dirpath = os.path.dirname(filename)
with open(filename) as file, NamedTemporaryFile("w", dir=dirpath) as outfile:
    for line in file:
        if delete not in line:
           print >>outfile, line, # copy old content
    outfile.delete = False # don't delete outfile
os.remove(filename) # rename() doesn't overwrite on Windows
os.rename(outfile.name, filename) # or just `os.replace` in Python 3.3+

答案 2 :(得分:1)

问题来自于读取和写入相同的文件。以下是对此的一些解释。

好参考(Beginner Python: Reading and writing to the same file

因此,当处于r+模式时,读取和写入文件都会向前移动文件指针。

让我们来看看你的例子。首先,你做一个readline。这会将文件指针移动到下一行。您检查刚刚读取的行是否有效,如果是,则将其写入。

问题是你刚刚覆盖了下一行,而不是前一行!所以你的代码实际上搞乱了你的数据。

基本上,如果文件很大,那就非常困难(想要做得很好)。您不能随意删除文件中间的字节。对于要删除的每一行,您必须在其上写入其余数据,然后在末尾截断文件以删除释放的空间。

您应该听取其他答案的建议,然后输出到另一个文件或stdout

答案 3 :(得分:0)

那么你也可以做到以下几点:

with open("input.txt",'r') as infile, open("output.txt",'w') as outfile: 
    # code here

    outfile.write(line)

在文件循环中,您可以执行以下操作:

if delete:
   continue

跳过您不想写入输出文件的行。