我一直试图想办法做以下事情:
打开并读取文件。该文件包含以下内容
15;0
2;0
读取行,行的第一个数字替换第二个数字,行的第一个数字替换为0:
f = open("data.txt", "r+")
for line in f:
if line != "\n":
lineList = line.replace("\n", "").split(";")
lineList[1] = lineList[0]
lineList[0] = "0"
dataLine = lineList[0] + ";" + lineList[1]
f.write(dataLine)
f.close()
将行写入文件时会出现此问题。如何在文件末尾写两行并删除前两行?感谢
答案 0 :(得分:3)
实现解决方案的最快方式(可能是更逻辑上正确的方法)是首先在一个上下文管理器中读取文件的内容,然后将处理后的数据写入另一个上下文管理器中的同一文件: / p>
data = list()
with open("data.txt", "r") as f:
for line in f.readlines():
if line != '\n':
listLine = line.split(";")
data.append("0;{}\n".format(listLine[0]))
with open('data.txt', 'w') as f:
for line in data:
f.write(line)
此外,您不需要为listLine
列表分配不同值,然后创建要写入文件的数据条目的开销。只需直接使用已有的东西。
此方法的缺点是内存使用 - 如果您的文件大于内存,则需要另外一种方法。
答案 1 :(得分:1)
检查您的代码。
listLine = line.split(";")
lineList[1] = lineList[0]
lineList[0] = "0"
设置变量listLine,然后调用lineList。
答案 2 :(得分:0)
@iulian的解决方案很好,但正如他所警告的那样 - 它需要足够的内存来保存数据。如果您期望大文件并且可以临时使用额外的磁盘空间(而不是RAM),则可以写入单独的输出文件,编写已处理的数据,然后用原始文件替换原始文件:
BaseForgotPasswordPage
如果您不能保证新行不会比旧行更长,则无法就地替换数据。如果发生这种情况,你会遇到自己的写入位置超过读取位置的情况,并且文件将会损坏。
但是,如果您可以确定没有新行会比旧行更长(例如,在转换后,源中肯定没有import shutil
import tempfile
with open("data.txt", "rU") as f_in:
f_out = tempfile.NamedTemporaryFile(delete=False)
for line in f_in:
if ";" in line:
line = "0;{}\n".format(line.split(";", 1)[0])
f_out.write(line)
f_out.close()
shutil.move(f_out.name, "data.txt")
行将变为"1234;"
,您可以执行此操作这也是:
"0;1234"
此版本就地更新,没有任何额外的内存或磁盘要求。
(注意,with open("data.txt", "rb+") as f:
write_offset = 0
for line in f.readlines():
line_len = new_len = len(line)
if ";" in line:
line = "0;{}\n".format(line.split(";", 1)[0])
new_len = len(line)
if new_len > line_len:
# Bad things had just happened.
raise RuntimeError("New line is longer than old one!"
" File is now corrupt.")
read_offset = f.tell() # Remember the current position
f.seek(write_offset) # Seek to where we should write to
f.write(line)
write_offset += new_len
f.seek(read_offset) # Return to where we were
# It could happen that new file is shorter.
f.seek(write_offset)
f.truncate()
有一个缓冲区,因此f.readlines()
结果不会是单独的行偏移 - 以防您出于任何原因想要使用它们。出于我们的目的,我们可以放心地忽略这里。)