从列表中写入Python会导致IndexError

时间:2016-05-13 16:09:50

标签: python list line

我一直试图想办法做以下事情:

打开并读取文件。该文件包含以下内容

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()

将行写入文件时会出现此问题。如何在文件末尾写两行并删除前两行?感谢

3 个答案:

答案 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()结果不会是单独的行偏移 - 以防您出于任何原因想要使用它们。出于我们的目的,我们可以放心地忽略这里。)