覆盖文件的一部分会导致空字符串Python 3

时间:2018-04-17 01:59:22

标签: python python-3.x file overwrite

编辑:解决方案只是改变我打开文件的方式(感谢Primusa),而不是我如何更换信息。

我试图覆盖文件的某些部分,但我的代码不起作用。当它运行时,它会完全删除文件中的所有内容,不会留下任何内容。

这是我的代码:

for fname in store:
    with open(fname + ".txt", "w+") as f:
        for line in f:
            c = store[fname]
            x = (c-1)%len(line.split(","))
            y = m.floor((c-1)/len(line.split(",")))

            for n in range(y):
                f.readline()

            ldata = line.strip("\n").split(",")
            for i in range(len(ldata)):
                ldata[i] = int(ldata[i])

            if w == None:
                ldata[x] += 1
            elif w == True:
                ldata[x] += 2
            elif w == False:
                ldata[x] -= 1

            #s = line.find("\n") - 1
            #f.truncate(s)
            f.write(str(ldata) + "\n")

键:

  • fname:对应于没有文件类型的文件名的字符串变量。
  • store:包含文件名键作为字符串和整数值的字典。
  • f:包含多行整数列表的文件。
  • c:一个整数变量,用于确定要访问的整数。
  • xy:将值设置为要在文件中访问的整数的列和行的变量。
  • w:存储为布尔值或None的变量,用于确定所访问的整数是增加还是减少,以及增加多少。
  • s:当前未使用的整数变量,用于截断文件的一部分。

使用示例:

假设我有一个文件Foo.txt,其中包含以下信息:

  

0,2,3,7

     

11,3,6,4

我想增加" 6"值为2,因此我运行代码时将w设置为True并将"Foo" : 7添加到store,因为" 6"是文件中的第7个数字(无论列表长度如何)。

应该发生什么:

Foo.txt已修改,现在包含:

  

0,2,3,7

     

11,3,8,4

实际发生了什么:

Foo.txt仍然存在,但现在包含:

  

也就是说它是空的。

我的代码出了什么问题?我是否正确处理文件,变量计算,语法或其他内容?

1 个答案:

答案 0 :(得分:3)

with open(fname + ".txt", "w+") as f:

以“w +”模式打开文件会截断文件,这意味着它会删除文件内的所有内容。在此语句之后执行的所有操作都在空文件中。

我建议在阅读模式下打开文件:

with open(fname + ".txt", "r") as f:

将文件加载到内存中,进行更改,然后以“w +”模式打开文件并将文件放回原位。

让我们在foo示例中执行此操作:

with open("foo.txt", 'r') as f: #open in read mode
    a = f.read().split(',') #breaking it apart so i can locate the 6th number easier
    a[6] = str(int(a[6]) + 2) #make my modifications
    a = ','.join(a) #convert it back to string
with open("foo.txt", 'w+') as f: #open in write and delete everything
    f.write(a) #write my modified version of the file

请注意,这是一个非常基本的示例,因此不会考虑换行符。