1

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

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

7 回答 7

2

因为您还需要写入文件。

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

现在你只是在读取和操作数据,而不是写回它们。

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

如果您正在寻找参考资料,请查看open()文档以及Python 教程的读取和写入文件部分。

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

于 2012-04-10T15:19:40.637 回答
2

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

编辑:我刚刚看到您的编辑...自然,如果您将所有数字都放在一行中,则该行永远不会等于 4。您可能希望一次读取文件一个字符,而不是一次读取一行。

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

于 2012-04-10T15:20:42.730 回答
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()
于 2012-04-10T15:21:27.997 回答
0

一些东西:

  • 指示模式的r标志。这显然不会让您写入文件。openread-only

  • print()将东西输出到屏幕上。您真正想要做的是输出到文件。你读过 Python 文件 I/O 教程吗?

  • for line in file_handle:一次循环遍历文件一行。因此,if line == '4'仅当该行由单个字符组成时,才会为真4,全部单独。

    如果要遍历字符串中的字符,请执行类似for character in line:.

  • “就地”修改文件的某些部分比您想象的要困难一些。

    这是因为如果您将数据插入文件的中间,则其余数据必须重新排列以腾出空间——这真的很慢,因为插入后的所有内容都必须重写。

    理论上,一个字节替换一个字节可以很快完成,但一般人们不想逐字节替换,所以这是一个高级功能。(请参阅seek()。)通常的方法是写出一个全新的文件。

于 2012-04-10T15:19:48.763 回答
0

您没有向数据发送任何输出,您只是在打印并且1通常是终端或解释器。9stdout

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

out = open(FileName, 'w')

你也可以使用

print >>out, '1'

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

此外,如果您想覆盖并在之后写入,最好先读取文件。

于 2012-04-10T15:21:02.777 回答
0

根据您的评论:

Numberdata 只是一行中的一组数字。也许这就是我要去错的地方?它是“444666444666444888111000444”

我可以告诉你,for循环迭代而不是chars。存在逻辑错误。

此外,正如 Rik Poggi 所说,您必须编写文件(只需记住以写入模式打开它)

于 2012-04-10T15:21:24.540 回答
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()

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

于 2012-04-10T15:26:13.617 回答