3

問題 - 更新:

スクリプトを印刷することはできましたが、標準出力を画面ではなくファイルに出力する方法を見つけるのに苦労しました。以下のスクリプトは、結果を画面に出力するために機能しました。このコードの直後にソリューションを投稿し、一番下の [ソリューション] までスクロールします。

最初の投稿:

Python 2.7.3 を使用しています。コロン () の後のテキスト ファイルの最後の単語を抽出し、:それらを別の txt ファイルに書き込もうとしています。これまでのところ、画面に結果を印刷することができ、完全に機能しますが、結果を新しいファイルに書き込もうとすると、str has no attribute write/writeline. ここにコードスニペットがあります:

# the txt file I'm trying to extract last words from and write strings into a file
#Hello:there:buddy
#How:areyou:doing
#I:amFine:thanks
#thats:good:I:guess

x = raw_input("Enter the full path + file name + file extension you wish to use: ")
def ripple(x):
  with open(x) as file:
    for line in file:
      for word in line.split():
        if ':' in word:
          try:
            print word.split(':')[-1]
          except (IndexError):
            pass 

ripple(x) 

上記のコードは、画面に印刷するときに完全に機能します。しかし、Python のドキュメントを読むのに何時間も費やしましたが、結果をファイルに書き込む方法が見つからないようです。ファイルを開いて writeline や readline などで書き込む方法は知っていますが、文字列では機能しないようです。

これを達成する方法について何か提案はありますか?

PS: 書き込みエラーの原因となったコードは追加しませんでした。

最初の投稿の終わり

解決策 - 更新:

以下のコードでpythonを抽出して別のファイルに保存することができました。

コード:

inputFile = open ('c:/folder/Thefile.txt', 'r')
outputFile = open ('c:/folder/ExtractedFile.txt', 'w')
tempStore = outputFile
for line in inputFile:
    for word in line.split():
        if ':' in word:
            splitting = word.split(':')[-1]
            tempStore.writelines(splitting +'\n')
            print splitting

inputFile.close()
outputFile.close()

アップデート:

私よりも droogans コードをチェックアウトすると、より効率的でした。

4

3 に答える 3

3

これを試して:

with open('workfile', 'w') as f:
    f.write(word.split(':')[-1] + '\n')

本当にメソッドを使用したい場合は、次のprintことができます。

from __future__ import print_function
print("hi there", file=f)

Python で行をファイルに書き込む正しい方法によると。__future__Python 2 を使用している場合はインポートを追加する必要があります。Python 3 を使用している場合は、既にインポートされています。

于 2012-07-15T10:10:33.540 に答える
1

.write()文字列オブジェクトを呼び出そうとしています。

fileobject.write(yourdata)引数が混同されているか (ではなく を呼び出す必要がありますyourdata.write(fileobject))、開いている宛先ファイル オブジェクトと文字列の保存の両方に誤って同じ変数を再利用しました。

于 2012-07-15T10:10:42.230 に答える
1

あなたの質問は良いと思います。完了したら、コード レビューに向かい、私が気付いた他の点についてコードを調べてください。

# the txt file I'm trying to extract last words from and write strings into a file
#Hello:there:buddy
#How:areyou:doing
#I:amFine:thanks
#thats:good:I:guess

まず、質問の冒頭にサンプル ファイルの内容を記載していただきありがとうございます。

x = raw_input("Enter the full path + file name + file extension you wish to use: ")

この部分は必要ないと思います。rippleよりも優れたパラメータを作成できますxfile_locかなり標準的なものだと思います。

def ripple(x):
  with open(x) as file:

を使用openすると、ファイルに発生している操作をマークできます。また、ファイル オブジェクトには、その役割に応じた名前を付けるのも好きです。言い換えれば、それが読み取られる私のファイルになることをwith open(file_loc, 'r') as r:思い出させます。r.foo

    for line in file:
      for word in line.split():
        if ':' in word:

まず、for word in line.split()ステートメントは "Hello:there:buddy" 文字列をリストに入れるだけです: ["Hello:there:buddy"]。より良いアイデアはsplit、ここでやろうとしていることを多かれ少なかれ行う引数を渡すことです。たとえば、"Hello:there:buddy".split(":")が出力['Hello', 'there', 'buddy']され、コロンの検索が完了したタスクになります。

          try:
            print word.split(':')[-1]
          except (IndexError):
            pass 

IndexError別の利点は、少なくとも空の文字列があり、分割すると空の文字列として返されるため、 をチェックする必要がないことです。つまり、その行には何も書き込まれません。

ripple(x) 

の場合ripple(x)は、代わりに を呼び出しますripple('/home/user/sometext.txt')

ですから、これに目を通し、コードレビューを調べてみてください。ウィンストンという男がいて、Python と自称初心者を使って本当に素晴らしい仕事をしています。私はいつも彼から新しいトリックを拾います。

これが私の見解であり、書き直されています。

import os #for renaming the output file

def ripple(file_loc='/typical/location/while/developing.txt'):
    outfile = "output.".join(os.path.basename(file_loc).split('.'))

    with open(outfile, 'w') as w:
        lines = open(file_loc, 'r').readlines() #everything is one giant list
        w.write('\n'.join([line.split(':')[-1] for line in lines]))

ripple()

これを行ごとに分解し、物事を変えてみてください。かなり凝縮されていますが、内包表記とリストの使用法を理解すると、このようにコードを読む方が自然になります。

于 2012-07-15T17:02:41.200 に答える