2014-09-04 32 views
0

我是新手到Python。我有一个代码,我必须将这些内容再次写入到同一个文件中,但是当我这样做时,它会清除我的内容。请帮助解决它。蟒蛇明确的内容写在同一个文件

我应该如何修改我的代码,这样的内容将在同一个文件中写回?

我的代码:

import re 

numbers = {} 
with open('1.txt') as f,open('11.txt', 'w') as f1: 
    for line in f: 
     row = re.split(r'(\d+)', line.strip()) 
     words = tuple(row[::2]) 
     if words not in numbers: 
      numbers[words] = [int(n) for n in row[1::2]] 
     numbers[words] = [n+1 for n in numbers[words]] 
     row[1::2] = map(str, numbers[words]) 

     indentation = (re.match(r"\s*", line).group()) 
     print (indentation + ''.join(row)) 
     f1.write(indentation + ''.join(row) + '\n')   
+2

写回文本到同一文件将让你不高兴。 – 2014-09-04 14:06:15

+0

通过修改代码,我的意思是创建新的写文件可能是相同的文件名? – 2014-09-04 14:08:30

+0

@adsqwqwe如果你只需要追加到文件,那么你就有一个答案,否则你需要将文件加载到内存中来修改它,或者你可以加载到新的临时文件,然后将其重命名。 – JosEduSol 2014-09-04 14:10:18

回答

1

使用

open('11.txt', 'a') 

要追加到文件,而不是W代表写(新的或覆盖文件)。

+0

提问者并不想追加,他们希望覆盖现有文件。 – 2014-09-04 14:09:53

+0

上追加它将覆盖,它会毁了我file.is还有其他方法吗? – 2014-09-04 14:10:31

+1

在这种情况下,我建议写入另一个文件,然后删除原始文件并复制另一个文件(或者其他任何你想要的东西;这对我来说不是100%清楚的)。但是读/写同一个文件通常不是一个好主意。 – 2014-09-04 14:20:09

2

在一般情况下,这是一个坏主意,写了你还在处理文件(或转换其中你迭代的数据结构)。这是可以做到的...但它需要很多照顾,并且几乎没有安全或重新启动能力应的东西出问题中间(错误,电源故障等)

一个更好的方法是编写一个干净的新文件,然后将其重命名为旧名称。例如:

import re 
import os 

filename = '1.txt' 
tempname = "temp{0}_{1}".format(os.getpid(), filename) 
numbers = {} 
with open(filename) as f, open(tempname, 'w') as f1: 
    # ... file processing as before 

os.rename(tempname, filename) 

这里,我已经下降了文件名(原件和临时)到变量,这样他们就可以很容易地被称为多次或改变。这也为您将此代码提升为函数(作为较大程序的一部分)做准备,而不是将其作为程序的主线。

你并不需要严格的临时名称嵌入进程ID,但它确保临时文件被唯一命名(temp32939_1.txt VS temp_1.txttempfile.txt,说)的标准方法。

这也可能是有用的,因为他们处理之前创建文件的备份。在这种情况下,在os.rename(tempname, filename)之前,您可以放入代码以将原始数据移动到更安全的位置或备份名称。例如:

backupname = filename + ".bak" 
os.rename(filename, backupname) 

os.rename(tempname, filename) 

虽然超出了这个问题的范围,如果你使用的只读进程覆写战略频繁,将有可能创建一个抽象这些文件处理细节远离你的处理代码单独的模块。 Here is an example.

0

如果你想阅读和一次性使用“R +”模式修改文件。

f=file('/path/to/file.txt', 'r+') 
content=f.read() 
content=content.replace('oldstring', 'newstring') #for example change some substring in whole file 
f.seek(0) #move to beginning of file 
f.write(content) 
f.truncate() #clear file conent "tail" on disk if new content shorter then old 
f.close() 
+0

正如很多人所说,阅读和写作同一个文件不是一个好主意,不应该被鼓励。另外,你实际上并没有在这里写任何文件,所以你刚刚抹去了一切。 – Ajean 2014-09-04 15:39:25

+0

感谢您指点我,我在内容更改后忘记了'write()'语句。另外,我认为编辑小文件并不是很糟糕,特别是在我更改我的示例时,如果在write()后面截断。 – wWolfovich 2014-09-05 06:46:35

+0

嗯,我感谢你试图解决你的答案,但你把写之前的截断所以效果是一样的。在发布之前测试你的答案是一个非常好的主意,它可以防止这样的bugaboos。 – Ajean 2014-09-05 13:01:16