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'.と行末のすべての空白を削除します。

編集:私はあなたの編集を見たところです...当然、すべての数字が1行にある場合、その行は決して4に等しくなりません。おそらく、一度に1行ではなく、一度に1文字ずつファイルを読みたいと思うでしょう。

第二に、ファイルに書き込んでいないので、当然ファイルは変更されません。ファイルを読みながらファイルを変更するのは困難です (読み込んだのと同じ場所にバックアップする方法を見つけなければならないため)。そのため、通常はあるファイルから読み込んで別のファイルに書き込みます。

于 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:一度に1行ずつファイルをループします。したがって、if line == '4'行が単一の文字で構成されている場合にのみ真になります4

    文字列内の文字をループする場合は、のような操作を行いますfor character in line:

  • 「インプレース」でファイルのビットを変更することは、あなたが思っているよりも少し難しいです。

    これは、ファイルの途中にデータを挿入する場合、残りのデータをシャッフルしてスペースを空ける必要があるためです。挿入後のすべてを書き換える必要があるため、これは非常に低速です。

    理論的には、1バイトから1バイトへの置換は高速に実行できますが、一般に、バイトごとに置換することは望まないため、これは高度な機能です。(を参照してくださいseek()。)通常のアプローチは、まったく新しいファイルを書き出すことです。

于 2012-04-10T15:19:48.763 に答える
0

データに出力を送信するのではなく、単に印刷するだけ19stdout通常は端末またはインタープリターです。

ファイルに書き込みたい場合はopenw. 例えば。

out = open(FileName, 'w')

あなたも使うことができます

print >>out, '1'

out.write('1')次に、たとえば呼び出すことができます。

また、上書きしてから書き込みたい場合は、最初にファイルを読み取ることをお勧めします。

于 2012-04-10T15:21:02.777 に答える
0

あなたのコメントによると:

Numberdata は、すべて 1 行の数字のロードです。多分それは私が間違っているところですか?「444666444666444888111000444」です

サイクルは、 charsではなくforを反復することがわかります。論理エラーがあります。

さらに、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 に答える