更改文件的内容 - Python

时间:2012-04-10 15:15:48

标签: python

所以我有一个运行的程序。这是代码的一部分:

FileName = 'Numberdata.dat'
NumberFile = open(FileName, 'r')
for Line in NumberFile:
  if Line == '4':
    print('1')
  else:
    print('9')
NumberFile.close()

一个毫无意义的事情,是的,但我只是为了增强我的理解。但是,此代码不起作用。该文件保持原样,4不会被1代替,其他所有内容都不会被9代替,它们只是保持不变。我哪里错了?

Numberdata.dat为"444666444666444888111000444"

现在是:

FileName = 'Binarydata.dat'
BinaryFile = open(FileName, 'w')
for character in BinaryFile:
  if charcter == '0':
    NumberFile.write('')
  else:
    NumberFile.write('@')
BinaryFile.close()

7 个答案:

答案 0 :(得分:2)

因为您还需要写入文件。

with open(FileName, 'w') as f:
    f.write(...)

现在你只是阅读和操纵数据,但你没有回复它们。

最后,您需要以写入模式重新打开文件并写入。

如果您正在寻找推荐信,请查看open() documentationReading and Writing FilesPython Tutorial部分。

编辑:您不应该从同一个文件同时读写。您可以写入临时文件并在结束时调用shutil.move(),或者加载并操作数据,然后重新 - 以写入模式打开原始文件并将其写回。 / p>

答案 1 :(得分:2)

首先,Line永远不会等于4,因为从文件中读取的每一行都包含末尾的换行符。尝试if Line.strip() == '4'.这将从行的开头和结尾删除所有空格。

编辑:我刚刚看到你的编辑...当然,如果你的所有数字都在一行上,那么这行就永远不会等于4.你可能想要一次读取一个字符,而不是一行中的一行时间。

其次,您没有写入任何文件,因此文件自然不会被更改。在阅读文件时,您将很难更改文件(因为您必须弄清楚如何备份到您刚读取的同一个地方),因此通常的做法是从一个文件读取并写入另一个文件。

答案 2 :(得分:1)

您需要构建一个字符串并将其写入文件。

FileName = 'Numberdata.dat'
NumberFileHandle = open(FileName, 'r')
newFileString = ""
for Line in NumberFileHandle:
  for char in line: # this will work for any number of lines.
      if char == '4':
        newFileString += "1"
      elif char == '\n':
        newFileString += char
      else:
        newFileString += "9"
NumberFileHandle.close()

NumberFileHandle = open(FileName, 'w')
NumberFileHandle.write(newFileString)
NumberFileHandle.close()

答案 3 :(得分:0)

一些事情:

  • r的{​​{1}}标记表示open模式。这显然不会让你写入文件。

  • read-only将内容输出到屏幕。你真正想要做的是输出到文件。你有read the Python File I/O tutorial?

  • print()一次循环一行文件。因此,for line in file_handle:只有在该行由单个字符if line == '4'组成时才会为真。

    如果要循环字符串中的字符,请执行4之类的操作。

  • “就地”修改文件位比你想象的要难一点。

    这是因为如果你将数据插入到文件的中间,其余的数据必须随机播放以腾出空间 - 这非常慢,因为插入后的所有内容都必须重写。

    理论上,单字节替换的单字节可以快速完成,但一般人们不希望逐字节替换,因此这是一项高级功能。 (参见for character in line:。)通常的方法是写出一个全新的文件。

答案 4 :(得分:0)

您没有向数据发送任何输出,只需将19打印到stdout,通常是终端或翻译。

如果您要写入该文件,则必须使用open再次使用w。 例如。

out = open(FileName, 'w')

您也可以使用

print >>out, '1'

然后你可以打电话给out.write('1')

如果你想覆盖并写下来,最好先读取文件。

答案 5 :(得分:0)

根据你的评论:

  

Numberdata只是一行数字的加载。也许这就是我出错的地方?它是“444666444666444888111000444”

我可以告诉你for周期,迭代而不是字符。存在逻辑错误。

此外,您必须编写该文件,正如Rik Poggi所说(只需在写入模式下将其打开)

答案 6 :(得分:0)

因为print不会写入您的文件。 你必须打开文件并阅读它,修改你获得的字符串,创建一个新字符串,再次打开文件并再次写入。

FileName = 'Numberdata.dat'
NumberFile = open(FileName, 'r')
data = NumberFile.read()
NumberFile.close()
dl = data.split('\n')
for i in range(len(dl)):
    if dl[i] =='4':
        dl[i] = '1'
    else:
        dl[i] = '9'
NumberFile = open(FileName, 'w')
NumberFile.write('\n'.join(dl))
NumberFile.close()

尝试这种方式。肯定有不同的方法,但这对我来说似乎是最“线性的”=)