我遇到了一个时间跟踪程序的问题,我试图通过迭代它然后写行来识别文件中的一行,除非有任何变量“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")
答案 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
跳过您不想写入输出文件的行。